C++ 中的 main 定义

• 本文约 389 字,阅读大致需要 1 分钟 | Development | #C++ | #C | #Programming | #Linkage | #GCC | #LLVM

新的C++ 标准中 不允许给main指定linkage-specification 了。

当然,考虑到原本main() 也是C运行环境在开始运行程序的时候调用的,而C运行环境自然也预期C linkage,即不按照C++ 的习惯对符号根据参数增加名字前缀,因此大部分编译器在遇到C++ 程序定义全局main() 的时候也会按照习惯采取C linkage方式去翻译。这一规则首先被GCC采纳,随后LLVM也跟进了。

然而我今天遇到一个奇葩彻底把我雷到了。此君是在一个C++ namespace中定义的main,故而此君用到了:

1
2
3
4
5
6
namespace foo::bar::baz {
    // ...
    extern "C" int main() {
        // ...
    }
}

「这题我会」,我想,不就是把 int main() 前面的 extern "C" 去掉吗?完全没注意到前面说的namespace。更为精妙的是,此君在 main 中调用了该名字空间的方法。

写得挺好的,下回别再这么写了。

入侵性最小的解法,便是在名字空间外定义一个新的 main 函数去调用名字空间里面那个。换言之,还是去掉 extern "C",但是在名字空间外再定一个 main() 去调用它:

int main() {
    return foo::bar::baz::main();
}

实在是有些dirty。