Почему gcc -ansi удаляет объявления cosf и т.п.?

Вы, наверное, думаете, что я совершенно сумасшедший и ужасно плохо программирую. Один из таких случаев может иметь место, но, пожалуйста, ознакомьтесь с моими выводами.

Да, я #include <math.h>

Полный код можно найти здесь. (я пытался сделать его совместимым с ansi, чтобы компилируется на VS2010, это из-за ошибки о смешанном коде и объявлении и отсутствии fminf (). Я был удивлен, что VS2010 позаботился о смешанном коде и объявлении с уровнями предупреждений по умолчанию. Я помню, что 2008 год не заботился, но мог ошибаться.)

Вот результат gcc при использовании стандарта c89 / -ansi. обратите внимание на неявные объявления функций. Есть еще несколько других неиспользуемых параметров, но пока нас это не интересует. (требуется для подписи для регистрации обратных звонков в GLUT)

Когда я запускаю приложение с использованием стандарта c89 или ansi, оно выдает неверный результат, как и математические функции не работают должным образом.

$ STANDARD=-std=c89 make -f Makefile.Unix
gcc -std=c89 -Wextra -Wall -pedantic  -c -o file-util.o file-util.c -I/usr/X11R6/include
gcc -std=c89 -Wextra -Wall -pedantic  -c -o gl-util.o gl-util.c -I/usr/X11R6/include
gcc -std=c89 -Wextra -Wall -pedantic  -c -o meshes.o meshes.c -I/usr/X11R6/include
In file included from meshes.c:12:
vec-util.h: In function ‘vec_length’:
vec-util.h:10: warning: implicit declaration of function ‘sqrtf’
meshes.c: In function ‘calculate_flag_vertex’:
meshes.c:48: warning: implicit declaration of function ‘sinf’
meshes.c:50: warning: implicit declaration of function ‘cosf’
gcc -std=c89 -Wextra -Wall -pedantic  -c -o flag.o flag.c -I/usr/X11R6/include
In file included from flag.c:18:
vec-util.h: In function ‘vec_length’:
vec-util.h:10: warning: implicit declaration of function ‘sqrtf’
flag.c: In function ‘update_p_matrix’:
flag.c:58: warning: implicit declaration of function ‘fminf’
flag.c: In function ‘mouse’:
flag.c:252: warning: unused parameter ‘x’
flag.c:252: warning: unused parameter ‘y’
flag.c: In function ‘keyboard’:
flag.c:261: warning: unused parameter ‘x’
flag.c:261: warning: unused parameter ‘y’
flag.c: At top level:
vec-util.h:1: warning: ‘vec_cross’ defined but not used
vec-util.h:13: warning: ‘vec_normalize’ defined but not used
gcc -o flag file-util.o gl-util.o meshes.o flag.o -L/usr/X11R6/lib -lGL -lglut -lGLEW

Теперь, используя стандарт c99, неявное объявление сообщений функций исчезло.

$ STANDARD=-std=c99 make -f Makefile.Unix
gcc -std=c99 -Wextra -Wall -pedantic  -c -o file-util.o file-util.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic  -c -o gl-util.o gl-util.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic  -c -o meshes.o meshes.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic  -c -o flag.o flag.c -I/usr/X11R6/include
flag.c: In function ‘mouse’:
flag.c:252: warning: unused parameter ‘x’
flag.c:252: warning: unused parameter ‘y’
flag.c: In function ‘keyboard’:
flag.c:261: warning: unused parameter ‘x’
flag.c:261: warning: unused parameter ‘y’
flag.c: At top level:
vec-util.h:1: warning: ‘vec_cross’ defined but not used
vec-util.h:13: warning: ‘vec_normalize’ defined but not used
gcc -o flag file-util.o gl-util.o meshes.o flag.o -L/usr/X11R6/lib -lGL -lglut -lGLEW

При использовании стандарта c99 программа ведет себя должным образом и ожидаемо.

Вопрос

Почему использование флага -ansi, казалось бы, удаляет объявления из math.h?


person EnabrenTane    schedule 03.01.2011    source источник


Ответы (2)


Если вы проверите GCC Builtins documentation, вы увидите, что функции sinf и cosf (и многие другие связанные) представлены в стандарте C99.

person ismail    schedule 03.01.2011
comment
Хм. Их вроде бы убрали, потому что их на самом деле нет. -Wall -Wextra -ansi -pedantic были моими флагами компиляции в школе, и я был почти уверен, что мы использовали sinf () и тому подобное. Я должен пойти посмотреть на это. Спасибо! Принимаю ответ, когда это позволяет мне. - person EnabrenTane; 03.01.2011

Не используйте -ansi для современного кода. Несмотря на то, что текущая версия ANSI C согласована с ISO9899-1999 (C99), -ansi был постоянно назначен gcc для обозначения «устаревшего режима». Просто используйте -std=c99, если вы компилируете код C99. Это современный эквивалент.

person R.. GitHub STOP HELPING ICE    schedule 03.01.2011
comment
И не забудьте дать пощечину любым сопровождающим GCC, с которым вы встретитесь, за их ужасное неправильное использование термина ansi. - person Stephen Canon; 05.01.2011
comment
И дайте им несколько дополнительных пощечин, чтобы оставить -Dlinux=1 и -Dunix=1 в параметрах препроцессора по умолчанию, нарушив любую совместимую программу, которая использует символы с этими именами, если вы не используете -ansi или -std параметр для их удаления. - person R.. GitHub STOP HELPING ICE; 05.01.2011