我应该在每个头文件中放置一个 C++ 宏保护吗?

朱痘

我正在写一个小 C 项目。由于我希望它也包含在 C++ 中,因此我考虑使用 C++ 防护来使其工作,例如:

#ifdef __cplusplus
extern "C" {
#endif
// code
#ifdef __cplusplus
}
#endif

在我的项目中,我有一些头文件不能直接从使用该项目的最终 C++ 文件中包含。但是我面临着疑问:在头文件中放置 C++ 防护是否也是必要的预防措施?

克利福德

不得直接从最终的 C++ 文件中包含

即使它们是通过嵌套包含间接包含的,也将应用 C++ 编译,并且如果没有extern "C"符号,C++ 编译模块中的符号将与您链接到的 C 编译模块中的符号不​​同。

除此之外,这是一种很好的做法,并且为了互操作性而包含它们不会造成任何损害 - 您现在可能不打算在 C++ 编译中使用这些头文件,但您无法确定将来会如何使用它们。

如果要明确阻止 C++ 编译应用于 C 头文件,更好的解决方案是使用:

#if defined __cplusplus
    #error C-only header included in C++ compilation
#endif

这样,该问题在编译(或实际上是预处理)时会突出显示,而不是导致链接器错误,当它告诉您xxx未定义时,当您明确定义它时可能更难解释- 但使用不同的语言。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该在Angular 4+应用程序中为每个组件创建一个模块吗?

C ++创建一个头文件来解决循环依赖是一个好主意吗?

VueJS:我应该在Vue-Router SPA中放置一些常见的JS util吗?

我应该在Model或viewModel中放置“必需”数据注释吗?

Angular2 RC5:我应该在NgModule中放置接口吗?

我应该在每个类方法中创建一个新的Promise吗?

如何在另一个头文件中包含c头文件?

我应该为C ++中的每个类型提供一个解析器吗?

我应该在堆上创建一个新的QDomDocument吗?

我应该在Laravel项目中的各个视图中放置CSS样式吗?

在C中保护宏

在C ++中使用另一个头文件中的抽象类

我应该在C端未定义的子例程旁边放置“ bind(C)”吗?

我应该在同一个REST实体上提供不同的视图吗?

我应该在C ++中删除静态对象吗

当文件受安全文件保护时,从计划的任务中执行MS Access宏吗?

我应该在模板类头文件中包含所需的所有内容吗?

我应该在学习Swift之前学习一下object-c吗?

我可以在C ++的头文件中放置内联函数吗?

我应该在每个页面上放置一个Google登录按钮吗?

我应该在.bashrc或.profile中放置别名吗?

我应该在一个容器中设置时间吗?

我可以用密码保护Excel宏吗?

C++ - 在另一个头文件中包含一个头文件以使全局变量可用于数组声明

C++ 在两个头文件中包含一个类

应该在另一个模型中放置模型列表吗?

使用 websockets 时,我应该为每个不同的任务打开一个新的 websocket 连接吗?或者我应该在一个连接中做所有事情?

我应该在 C 中创建一个全局缓冲区吗

我应该在 Axon 的同一个包中声明异常吗?