0

我已经在我的 Mac 上使用这种方法安装了 GCC 4.8。一切正常,除了对于某些函数,如scanfand 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 -Werroror -Wall -Werror,但它们不起作用。

4

3 回答 3

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$ 
于 2013-04-03T06:44:58.560 回答
1

您没有得到诊断的原因<iostream>是包括声明printf,它似乎与c++0xorc++11标志有关。

这使用以下命令行在 gcc 4.8 快照上编译:

g++ -Wall -Wextra -pedantic-errors -std=c++0x

#include <iostream>
int main()
{
    printf("Hello World!\n");
    return 0;
}

如果您注释掉<iostream>包含或删除 C++11 编译标志,则会收到错误消息。

impl_decl.cpp:在函数“int main()”中:

impl_decl.cpp:5:28: 错误: 'printf' 未在此范围内声明

于 2013-04-03T06:56:30.803 回答
0

来自Annex C/Compatibility2003 年的 C++ 标准:

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.

于 2013-04-03T06:52:44.580 回答