Я полагаю, что вы, скорее всего, ищете флаг -Wall
, который вы, возможно, захотите объединить с -std=XX
, где XX - один из (c89 | gnu89 | c99 | gnu99 | ...) и / или, возможно, -pedantic
, что еще более раздражает педантично (или даже * сдерживает в зависимости от вашего настроения:)
Кстати, вы забыли включить stdlib.h (для exit ()).
#include <stdio.h>
#include <stdlib.h>
void takes_a_float ( float some_num ) {
printf("float Hello %f\n", some_num );
}
int main (int argc, char **argv) {
float my_boat = 1.0;
takes_a_float ( my_boat );
exit( 0 );
}
и вывод моей консоли:
mctaylor@tigger:stackoverflow$ gcc -Wall -pedantic long_float.c -o long_float
mctaylor@tigger:stackoverflow$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
...
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12)
Использование -Wall -pedantic заставляет вас писать чистый, явный код и может помочь вам обнаружить множество потенциальных глупых ошибок. Удачи.
Интересно, могут ли "отсутствующие предупреждения" быть вызваны правилами продвижения типа C. (См. K & R Язык программирования C, 2-е изд, раздел 2.7 - Преобразование типов ). Просто пища для размышлений.
Надеюсь, это поможет.
ИЗМЕНЕНО для добавления дополнительных материалов (далее):
Другой вариант или подход: splint (Secure Programming Lint) или Gimple Software * PC-lint / FlexLint , которые lint реализуют статический анализ исходного кода C, который помечает подозрительные и непереносимые конструкции.
mctaylor@tigger:stackoverflow$ splint sad_story.c
Splint 3.1.2 --- 07 May 2008
sad_story.c: (in function takes_a_long)
sad_story.c:5:26: Format argument 1 to printf (%lu) expects unsigned long int
gets long int: sad_story
To ignore signs in type comparisons use +ignoresigns
sad_story.c:5:20: Corresponding format code
sad_story.c: (in function main)
sad_story.c:21:18: Function takes_a_long expects arg 1 to be long int gets
float: my_boat
To allow all numeric types to match, use +relaxtypes.
sad_story.c:22:19: Function takes_a_float expects arg 1 to be float gets long
int: sad_story
sad_story.c:12:15: Parameter argc not used
A function parameter is not used in the body of the function. If the argument
is needed for type compatibility or future plans, use /*@unused@*/ in the
argument declaration. (Use -paramuse to inhibit warning)
sad_story.c:12:28: Parameter argv not used
sad_story.c:4:6: Function exported but not used outside sad_story: takes_a_long
A declaration is exported, but not used outside this module. Declaration can
use static qualifier. (Use -exportlocal to inhibit warning)
sad_story.c:6:1: Definition of takes_a_long
sad_story.c:8:6: Function exported but not used outside sad_story:
takes_a_float
sad_story.c:10:1: Definition of takes_a_float
Finished checking --- 7 code warnings
Вы также можете попробовать пример из FlexLint на онлайн-тестировании Gimpel , который является более чистым и красивым.