C++ 中的 main 定义
新的C++ 标准中 不允许给main指定linkage-specification 了。
当然,考虑到原本main() 也是C运行环境在开始运行程序的时候调用的,而C运行环境自然也预期C linkage,即不按照C++ 的习惯对符号根据参数增加名字前缀,因此大部分编译器在遇到C++ 程序定义全局main() 的时候也会按照习惯采取C linkage方式去翻译。这一规则首先被GCC采纳,随后LLVM也跟进了。
然而我今天遇到一个奇葩彻底把我雷到了。此君是在一个C++ namespace中定义的main,故而此君用到了:
| |
「这题我会」,我想,不就是把 int main() 前面的 extern "C" 去掉吗?完全没注意到前面说的namespace。更为精妙的是,此君在 main 中调用了该名字空间的方法。
写得挺好的,下回别再这么写了。
入侵性最小的解法,便是在名字空间外定义一个新的 main 函数去调用名字空间里面那个。换言之,还是去掉 extern "C",但是在名字空间外再定一个 main() 去调用它:
int main() {
return foo::bar::baz::main();
}实在是有些dirty。