Функция round и gntime_r (Как с ними транслировать?)

Модератор: Модераторы разделов

MiK13
Сообщения: 1290
ОС: Linux Debian

Функция round и gntime_r

Сообщение MiK13 »

ОС Linux Debian Etch 4.0r0
Проблема: решил воспрользоваться функцией round, чтобы округлить результат до ближайшего целого числа.
man round выдал, что надо добавить #include <math.h>. Он у меня в файле был.
Но компилятор всё равно стал "ворчать":
$ make
gcc -Wall -O2 -c prog2.c
prog2.c: In function 'calcmsht':
prog2.c:162: warning: implicit declaration of function 'round'
prog2.c:162: warning: incompatible implicit declaration of built-in function 'round'
Почитал ещё раз man round -- увидел рекомендацию для трансляции: -std=c99
Добавил, но компилятор стал "ворчать" на функцию gmtime_r:
$ make
gcc -std=c99 -Wall -O2 -c prog2.c
prog2.c: In function 'OutSigList':
prog2.c:233: warning: implicit declaration of function 'gmtime_r'

Как мне странслировать программу, чтобы компиляция прошла без предупреждений.
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Функция round и gntime_r

Сообщение BlackStar »

По первому вопросу, функция round() находится в библиотеке libm, поэтому следует добавить ключ -l:

Код: Выделить всё

gcc -Wall -O2 -c prog2.c -lm
LightLang Team
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Функция round и gntime_r

Сообщение MiK13 »

BlackStar писал(а):
22.09.2008 16:46
По первому вопросу, функция round() находится в библиотеке libm, поэтому следует добавить ключ -l:

Код: Выделить всё

gcc -Wall -O2 -c prog2.c -lm

Файл prog2.c:

Код: Выделить всё

#include <math.h>
#include <stdio.h>
double x,y;
int n;
int main() {
  for(x=-3;x<=3;x+=0.1) {
    n=y=round(x);
    printf(" %22.18f -> %4.1f -> %d\n",x,y,n);
  }
  return 0;
}


Код: Выделить всё

mik13@mishak:~/Prog$ gcc -Wall -O2 -c prog2.c -lm
prog2.c: In function 'main':
prog2.c:9: warning: implicit declaration of function 'round'
prog2.c:9: warning: incompatible implicit declaration of built-in function 'round'
gcc: -lm: linker input file unused because linking not done

Ключ -lm не убрал, а только добавил ещё одно сообщение. Что, впрочем, естественно -- при указании -c ключ -l смысла не имеет.
Странно другое. Если вместо round использую roundf (тоже самое, тольео не double, а float), то ситуация аналогичная.
При обычной компиляции предупреждения о подразумеваемом объявлении функции roundf и его несовместимости остаются.
Если добавить при компиляции -std=c99, то эти предупреждения исчезают. Но если убрать их текста #include <math.h>, то они снова возникают.
При этом ни в одном файле в каталоге /usr/include Midnight Commander строки roundf у меня не находит.
А исполняемые файлы во всех трёх случаях получаются идентичными
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Функция round и gntime_r

Сообщение Rootlexx »

MiK13
Добавьте в заголовок программы:

Код: Выделить всё

#define _XOPEN_SOURCE 600
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Функция round и gntime_r

Сообщение MiK13 »

Rootlexx писал(а):
22.09.2008 20:14
MiK13
Добавьте в заголовок программы:

Код: Выделить всё

#define _XOPEN_SOURCE 600

Спасибо, помогло. Предупреждения перестали появляться и без -std=c99

А в каких случаях желательно определение именно _XOPEN_SOURCE 600, а не _GNU_SOURCE ?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Функция round и gntime_r

Сообщение Rootlexx »

MiK13 писал(а):
23.09.2008 19:53
А в каких случаях желательно определение именно _XOPEN_SOURCE 600, а не _GNU_SOURCE ?

Почитайте man feature_test_macros.
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Функция round и gntime_r

Сообщение MiK13 »

Rootlexx писал(а):
24.09.2008 11:49
MiK13 писал(а):
23.09.2008 19:53
А в каких случаях желательно определение именно _XOPEN_SOURCE 600, а не _GNU_SOURCE ?

Почитайте man feature_test_macros.

Спасибо
Спасибо сказали: