【发布时间】:2014-09-20 04:19:16
【问题描述】:
只是好奇为什么使用 gcc 编译的这段代码(显然是错误的)可以编译,但是使用 g++ 编译的相同代码却没有。
int main()
{
char *foo = {"bar", "fred", "bob"};
return 0;
}
gcc 给出了这个警告,但仍然编译并生成二进制文件:
% gcc -o x x.c
x.c:在函数“main”中:x.c:3:5:警告:超出 标量初始化程序中的元素 [默认启用] x.c:3:5: 警告: ('foo' 的初始化附近)[默认启用] x.c:3:5: 警告: 标量初始化程序中的多余元素 [默认启用] x.c:3:5: 警告:(“foo”的接近初始化)[默认启用]
% ls -l x
-rwxr-xr-x 1 overdrive overdrive 6593 Jul 28 21:51 x
g++ 给出了这个错误并且没有任何二进制输出:
% g++ -o y y.cpp
y.cpp:在函数“int main()”中: y.cpp:3:38: 错误:标量对象‘foo’需要初始化器中的一个元素
% ls -l y
ls: 无法访问 y: 没有这样的文件或目录
我使用的 gcc 和 g++ 版本是:
% g++ --version
g++ (Debian 4.7.2-5) 4.7.2 版权所有 (C) 2012 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
有什么好的理由可以在 gcc 中编译而不是在 g++ 中编译吗?或者这显然是一个错误?
【问题讨论】:
-
编译器当然可以编译无效代码——它是否按预期工作是未定义的
-
记住:C 和 C++ 是不同的语言。
-
哪个是最好的
g++,它会给你一个错误,或者gcc,它会给你不确定的行为? -
你也可以让 gcc 更加严格 (demo)。
-
好吧,我的问题是如果这是 gcc 编译器的一个错误,因为显然 char* 永远不应该初始化指向 char 的指针数组。
标签: c++ c gcc compiler-errors g++