IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

C++ 中的 main 定义

delphij's Chaos 2026-05-10 17:39:55 累计浏览 203 次
本机暂存

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

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

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

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。

同分类推荐文章

  1. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)
  2. 如何做决策 - 从 Go 的一个 issue 说起 (2026-06-26 08:00:00)
  3. Seven Player:Windows上播放115网盘视频的增强工具 (2026-06-09 00:06:47)

查看更多 开发者 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,448)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,411)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,258)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,497)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,443)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,875)
  7. 浅析C++多线程内存模型 (累计阅读 8,802)
  8. C++ 多线程编程总结 (累计阅读 8,097)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,206)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,580)