我在Mac上使用this method安装了GCC 4.8。一切正常,但对于scanf
和printf
等特定函数,即使我没有包含cstdio
等各自的库,程序也会编译好而没有任何错误/警告。对于GCC(更具体地说是G ++,因为我正在处理C ++程序),有什么方法可以在输入这样的代码时抛出错误吗?以下代码在我的机器上编译正常:
#include <iostream>
//Notice I did not include cstdio but my program uses printf later on
int main()
{
printf("Hello World!\n");
return 0;
}
我被建议使用-Werror-implicit-function-declaration -Werror
或-Wall -Werror
,但它们不起作用。
答案 0 :(得分:2)
-Wimplicit-function-declaration -Werror
适合我。还必须有其他一些问题。
h2co3-macbook:~ h2co3$ cat baz.c
#ifndef BAILZ_OUT
#include <stdio.h>
#endif
int main()
{
printf("Hello world!\n");
return 0;
}
h2co3-macbook:~ h2co3$ gcc -o baz baz.c -Wimplicit-function-declaration -Werror
h2co3-macbook:~ h2co3$ echo $?
0
h2co3-macbook:~ h2co3$ gcc -o baz baz.c -Wimplicit-function-declaration -Werror -DBAILZ_OUT
cc1: warnings being treated as errors
baz.c: In function ‘main’:
baz.c:7: warning: implicit declaration of function ‘printf’
baz.c:7: warning: incompatible implicit declaration of built-in function ‘printf’
h2co3-macbook:~ h2co3$ echo $?
1
h2co3-macbook:~ h2co3$
答案 1 :(得分:1)
您没有得到诊断的原因是<iostream>
包含printf
的声明,它似乎与c++0x
或c++11
标志有关。
使用以下命令行编译gcc 4.8快照:
g ++ -Wall -Wextra -pedantic-errors -std = c ++ 0x
#include <iostream>
int main()
{
printf("Hello World!\n");
return 0;
}
如果您注释掉<iostream>
include,或删除C ++ 11编译标记,则会出错。
impl_decl.cpp:在函数'int main()'中:
impl_decl.cpp:5:28:错误:'printf'未在此范围内声明
答案 2 :(得分:0)
来自2003年C ++标准的Annex C/Compatibility
:
C.1 C ++和ISO C:
C.1.3第5条:表达式[diff.expr]
5.2.2
变更:不允许隐含的职能申报 基本原理:C ++的类型安全特性。
这意味着隐式声明必须在C ++中导致编译错误。
我猜你正在编译的不是C ++文件,而是C文件而你正在使用某些预C99模式,这是gcc中的默认模式。 1999年的C标准也不允许隐含声明。
您可能希望将这些选项的组合传递给gcc:-std=c99 -Werror
。