定义 header 所依赖的宏时,例如 _FILE_OFFSET_BITS
、FUSE_USE_VERSION
、_GNU_SOURCE
等,其中放置它们的最佳位置?
我考虑过的一些可能性包括
- 在任何依赖于该文件中包含的 header 公开的定义的源文件的顶部
- 紧接在相关 header 的包含之前
- 通过编译器在
CPPFLAGS
级别定义? (例如-D_FILE_OFFSET_BITS=64
)用于:- 整个源代码库
- 整个项目
- 只是需要它的来源
- 在项目 header 中,还应包括那些应用宏的相关 header
- 其他一些我没有想到的地方,但是无限优越
注意:根据 make、autotools 和其他构建系统的适用性进行论证是我做出决定的一个因素。
最佳答案
如果宏影响系统头文件,它们可能应该去影响每个包含这些系统头文件(包括间接包含它们的源文件)的源文件的地方。因此,最合乎逻辑的地方是在命令行上,假设您的构建系统允许您设置例如CPPFLAGS 影响每个文件的编译。
如果您使用预编译头文件,并且有一个必须首先包含在每个源文件中的预编译头文件(例如 MSVC 项目的 stdafx.h),那么您也可以将它们放在那里。
对于影响独立库(无论是第三方库还是您编写的库)的宏,我会创建一个包装器 header 来定义宏,然后包含库 header 。然后,您项目中对库的所有使用都应包含包装器 header ,而不是直接包含库 header 。这避免了不必要地定义宏,并清楚地表明它们与该库相关。如果库之间存在依赖关系,那么为了安全起见,您可能希望将宏设为全局(在构建系统或预编译头文件中)。
关于c - header 的宏定义,放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384741/