在G ++中强制编译错误以用于未声明的函数

时间:2013-04-03 06:41:23

标签: c++ g++

我在Mac上使用this method安装了GCC 4.8。一切正常,但对于scanfprintf等特定函数,即使我没有包含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,但它们不起作用。

3 个答案:

答案 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++0xc++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