相关疑难解决方法(0)

用g ++编译的奇怪代码

以下代码使用g ++ 4.8.1成功编译:

int main()
{
    int(*)();
}
Run Code Online (Sandbox Code Playgroud)

它看起来像一个函数指针的简单声明:

int(*f)();
Run Code Online (Sandbox Code Playgroud)

它不能用clang 3.4和vc ++ 2013编译.

它是编译器错误还是标准的黑暗之处?


使用g ++ 4.8.1编译好的类似奇怪代码的列表(更新):

  1. int(*)();

  2. int(*);

  3. int(*){};

  4. int(*());

这些奇怪的代码片段的实例.

更新1: @Ali在评论中添加了一些有趣的信息:

所有4个案例都使用clang 3.5 trunk(202594)进行编译错误,并使用gcc 4.9 trunk(20140302)进行编译.行为是一样的-std=c++98 -pedantic,除了int(*){};可以理解的; 扩展初始化程序列表仅适用于-std=c++11.

更新2:正如@CantChooseUsernames他的回答中指出的那样,即使没有任何启用的优化,即使初始化它们仍然可以正常编译并且没有为它们生成汇编(无论是否初始化):

  1. int(*)() = 0;

  2. int(*) = 0;

  3. int(*){} = 0;

  4. int(*()) = 0;

带初始化的实例.

更新3:我真的很惊讶地发现int(*)() = "Hello, world!";编译也很好(int(*p)() = "Hello, world!";当然不会编译).

更新4:太棒了但int(*){} = Hello, world!;编译得很好.而下面的怪异之极的一段代码,也:int(*){}() …

c++ gcc g++ c++11

70
推荐指数
3
解决办法
3858
查看次数

为什么我能够为匿名函数指针变量分配函数引用?

以下代码编译得很好,我不知道为什么.有人可以向我解释为什么这是合法的吗?

我正在使用g ++(Debian 6.1.1-10)6.1.1 20160724进行编译.

#include <iostream>

int sum(int x, int y) { return x + y; }

int main(int argc, char *argv[])
{
    using std::cout;

    int (*) (int, int) = &sum;
    cout << "what" << '\n';
}
Run Code Online (Sandbox Code Playgroud)

附录

以下程序使用g ++版本5.4.0进行编译,但无法在gcc中编译.

int main()
{
    int (*) = 20;
}
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

20
推荐指数
1
解决办法
271
查看次数

标签 统计

c++ ×2

c++11 ×1

g++ ×1

gcc ×1

language-lawyer ×1