Это глюк с онлайн-компилятором C, gcc-7.2.0?

На онлайн-компиляторе C под названием jdoodle я попробовал этот простой фрагмент ниже:

#include<math.h>
#include<stdio.h>

int main(void)
{
    double f = 1.2;
    //printf("%f\n", ceil(f));
    printf("%f\n", ceil(1.2));
    return 0;
}

Это печатает:

2.000000

Что я и ожидал.

Но когда я изменяю код на:

printf("%f\n", ceil(f));  
//printf("%f\n", ceil(1.2));

Компилятор жалуется:

/tmp/ccv6kz5w.o: In function `main':
jdoodle.c:(.text+0x23): undefined reference to `ceil'
collect2: error: ld returned 1 exit status

Это довольно просто и понятно из справочной страницы дляceil() что требуется double переменная как единственный аргумент.

Когда я изменил версию компилятора на 5.3.0 с 7.2.0, оба кода были скомпилированы успешно и сгенерировали ожидаемый результат.

Почему обновленная версия компилятора жалуется на это?

Если компилятор прав насчет этого, может кто-нибудь сказать мне, почему ceil(f); будет проблематичным фрагментом кода, так что gcc-7.2.0 не считает его действительным, неожиданно присваивая "неопределенную ошибку ссылки" допустимой библиотечной функции?

Обновление: я попробовал тот же фрагмент с онлайн-компилятором codechef с C-GCC6.3, он прекрасно компилируется и генерирует ожидаемый результат.

1 ответ

Решение

Справочная страница для ceil(3) документ, который:

вам нужно #include <math.h>

и что ты должен

Связать с -lm,

Вы забыли настроить онлайн-компилятор для связи с -lm; возможно, тот, который вы используете, не предлагает такой опции.

Я рекомендую компилировать на своем компьютере.

Другие вопросы по тегам