【发布时间】:2014-05-25 18:42:46
【问题描述】:
以下代码使用g++ 4.8.1编译成功:
int main()
{
int(*)();
}
它看起来像一个简单的函数指针声明:
int(*f)();
它不能用 clang 3.4 和 vc++ 2013 编译。
它是编译器错误还是标准的黑暗地方之一?
用 g++ 4.8.1 编译好的类似奇怪代码片段列表(更新):
int(*)();int(*);int(*){};int(*());
Live example with these strange code pieces.
更新 1: @Ali 在 cmets 中添加了一些有趣的信息:
所有 4 种情况在使用 clang 3.5 主干 (202594) 时都会出现编译错误,而使用 gcc 4.9 主干 (20140302) 时编译良好。行为与
-std=c++98 -pedantic相同,但int(*){};除外,这是可以理解的;扩展初始值设定项列表仅适用于-std=c++11。
更新 2: 正如@CantChooseUsernames 在his answer 中指出的那样,即使进行了初始化,它们仍然可以正常编译,并且即使没有任何启用的优化,g++ 也不会为它们生成程序集(无论是否初始化) :
int(*)() = 0;int(*) = 0;int(*){} = 0;int(*()) = 0;
Live example with initializations.
更新 3:我很惊讶地发现 int(*)() = "Hello, world!"; 也可以正常编译(当然 int(*p)() = "Hello, world!"; 不能编译)。
更新 4: 很棒,但 int(*){} = Hello, world!; 编译得很好。还有下面这段极其奇怪的代码:int(*){}() = -+*/%&|^~.,:!?$()[]{}; (live example)。
更新 5:正如@zwol 在his comment 中指出的那样
这个问题和一些相关的语法问题正在被跟踪为 gcc bug 68265。
【问题讨论】:
-
int(*)();就像输入int;或int*;... 也就是说,您开始声明一个变量类型,但从不命名它。 -
fork(3)- 3 个人去 ideone 试图编译int;。 :) -
@chris 我想这与它的解析有关。似乎这是 g++ 中的一个错误,而 clang 和 VS 提供了正确的错误。
-
目前正在搜索eelis.net/C++/grammar.png,但在那里找不到
-
@PlasmaHH 这张照片很棒,谢谢分享。