我在CodeGolf上看到了一段代码片段,它是一个编译器炸弹,其中main
被声明为一个巨大的数组。 我尝试了以下(非炸弹)版本:
int main[1] = { 0 };
在Clang下编译似乎很好,在GCC下只有一个警告:
warning: 'main' is usually a function [-Wmain]
生成的二进制文件当然是垃圾。
但是为什么它能够编译呢?C规范是否允许这样做?我认为相关的部分说:
5.1.2.2.1 程序启动
程序启动时调用的函数名为main。实现没有为此函数声明原型。它应具有返回类型int且不带参数[...]或带两个参数[...]或以某种其他实现定义的方式定义。
“某些其他实现定义的方式”是否包括全局数组?(看起来规范仍然参考了函数。)
如果不是,那么这是编译器的扩展吗?还是工具链的特性,它具有某些其他目的,并且他们决定通过前端使其可用?