为什么不建议在头文件中定义宏
Why is it not advised to define macros in header files?
Google c++ Style Guide指南建议不能在.h
(头文件)中定义宏。这样做的缺点是什么?
预处理器按顺序将所有包含的源文件连接在一起。如果不取消定义宏,它可以应用到它最初定义位置之后的任何源代码。
由于头文件通常是库的公共API,您在头文件中定义的任何宏都可能最终出现在其他人的代码中,做一些意想不到的事情。
由于意想不到的事情是好软件的对立面,您应该:
- 不使用宏(习惯c++确实不应该)
- 在私有作用域中定义它们(总是选择private)或
- 使用后立即取消定义(尽管这使得它们在很大程度上对你自己的代码无用)
最佳解决方案取决于您的用例。Include守卫和其他简单、安全的定义通常被排除(类函数的宏更有可能导致问题,但你仍然可以做一些愚蠢的事情,比如define TRUE FALSE)。
你也可以考虑有条件地定义宏,这样它们就会出现在你的代码中,但不会成为公共API的一部分。在构建过程中检查变量集或将宏保存在单独的头文件中,允许其他人有选择地、显式地、有意识地包括它们,如果宏有助于避免大量样板文件,这将是很方便的。
与using语句不应该出现在头文件中的原因相同:命名空间污染。如果您想在头文件中使用宏,请确保在头文件的末尾取消对它们的定义,这样它们就不会被错误地包含。如果您只是想在头文件中定义它们并在cpp文件中使用它们,请确保"macros.h"永远不会包含在任何头文件中。
这里的who点是,您正在开发的任何公共API的最终用户可能不希望或期望,例如,sum(a, b)扩展到(a) + (b)。找到自己的宏错误的来源可能是一场噩梦,找到其他人几乎是不可能的。
相关文章:
- 告诉CMake链接到自定义文件夹中的Boost
- 通过cMake使用具有自定义文件扩展名的共享库
- 威纳派读取自定义文件或文件夹的所有访问权限
- 使用命令列表解析自定义文件
- 单独的类声明和方法定义文件问题
- Qt解析自定义文件格式
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- FAT32和NTF中的自定义文件属性
- 如何在没有"fatal error: Wt/WApplication: No such file or directory"的情况下将wt安装到自定义文件夹中
- C++ while 循环在自定义文件结构中
- QT C 读取自定义文件结构
- gcc 是否有编译指示来定义文件类型/编译器
- C/C++ 中的跨平台自定义文件头
- 使用头文件和类定义文件时未解决的外部符号错误
- 将此c++代码分解为单独的类规范文件和函数定义文件
- 自定义文件类中fstream对象的生存期
- 如何使用BinaryReader类使用C#读取自定义文件(C++)
- 提供带有libjpeg的自定义文件IO
- C++模块定义文件头内联符号
- 错误:未定义文件中的第一个引用符号