【问题标题】:Should you use extern "C" in a file that only has defines?你应该在只有定义的文件中使用 extern "C" 吗?
【发布时间】:2017-11-12 04:02:22
【问题描述】:

有没有意义:

#ifdef __cplusplus
  extern "C" {
#endif

// code...

#ifdef __cplusplus
  }
#endif

“代码...”只是一堆定义和类型定义(不包含等)?

【问题讨论】:

  • 随着 C 和 C++ 的继续分化,现在它的价值已经降低,但对于跨语言可移植性很有用,而且成本低,

标签: c++ c extern-c


【解决方案1】:

原则上,在您的特定情况下(没有变量或函数声明),extern "C" 毫无意义。

在实践中,它使代码更具可读性(显示了定义 C++ 友好接口的意图)并且不那么脆弱。一些开发人员(也许是您)可能(在几个月内)在其中添加其他声明。

【讨论】:

  • 感谢您的回复。但我不作为一个团队工作,我是一名 9 年级的学生,我把这作为一种爱好。尽管我很想在一个团队中工作;我的学校课程中没有其他人。
  • 但是即使你一个人,也需要写一些几个月后就能看懂的代码
  • 好点,我决定完全注释我的代码并将外部“C”添加到每个头文件中。我也要在github上放一个repo。
【解决方案2】:

这取决于您打算如何使用标头。

如果类型和值在 C 和 C++ 中均有效且含义相同,并且您打算在某些编译为 C 的编译单元和其他编译为 C++ 的编译单元中使用它们,则需要在编译时使用 extern "C"作为 C++。否则,您的 C++ 代码和 C 代码无法互操作。

如果编译单元包含的头文件只会被编译为 C 和 C++,但永远不会同时编译为两者,那么你不需要extern "C"。您可以使用特定于您所选语言的功能。

【讨论】:

  • 非常感谢。我决定排除外部“C”。这仅仅是因为唯一的 typedef 是 unsigned char,而定义只是十六进制整数值。
  • 根据您的需要,您可能希望考虑使用consts,而不是#defines。 const 的优势,假设一个合理的质量编译器,往往超过使用宏的好处。有关详细信息,请参阅 stackoverflow.com/questions/6442328/… 和链接的重复项。
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 2011-01-14
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2012-03-18
相关资源
最近更新 更多