c - header 的宏定义,放在哪里?

标签 c macros header autotools build-system

定义 header 所依赖的宏时,例如 _FILE_OFFSET_BITSFUSE_USE_VERSION_GNU_SOURCE 等,其中放置它们的最佳位置?

我考虑过的一些可能性包括

  1. 在任何依赖于该文件中包含的 header 公开的定义的源文件的顶部
  2. 紧接在相关 header 的包含之前
  3. 通过编译器在 CPPFLAGS 级别定义? (例如 -D_FILE_OFFSET_BITS=64)用于:
    1. 整个源代码库
    2. 整个项目
    3. 只是需要它的来源
  4. 在项目 header 中,还应包括那些应用宏的相关 header
  5. 其他一些我没有想到的地方,但是无限优越

注意:根据 make、autotools 和其他构建系统的适用性进行论证是我做出决定的一个因素。

最佳答案

如果宏影响系统头文件,它们可能应该去影响每个包含这些系统头文件(包括间接包含它们的源文件)的源文件的地方。因此,最合乎逻辑的地方是在命令行上,假设您的构建系统允许您设置例如CPPFLAGS 影响每个文件的编译。

如果您使用预编译头文件,并且有一个必须首先包含在每个源文件中的预编译头文件(例如 MSVC 项目的 stdafx.h),那么您也可以将它们放在那里。

对于影响独立库(无论是第三方库还是您编写的库)的宏,我会创建一个包装器 header 来定义宏,然后包含库 header 。然后,您项目中对库的所有使用都应包含包装器 header ,而不是直接包含库 header 。这避免了不必要地定义宏,并清楚地表明它们与该库相关。如果库之间存在依赖关系,那么为了安全起见,您可能希望将宏设为全局(在构建系统或预编译头文件中)。

关于c - header 的宏定义,放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384741/

相关文章:

c - 宏的参数在 C 中未被正确替换

c++ - 用于将 token 的整数映射到字符串的宏

css - iPad 2 : problems with correct menu display

c - C 多线程消费者-生产者程序中的段错误

c - Array[0] 在进入 "for"循环时发生变化,不知道为什么

macros - 如何获取 Nim 中的程序名称?

C++ 类没有名为 'blah' 的成员

networking - Kotlin 中的 Okhttp3,String.mediaType() 不起作用

c - c 中的移位运算符替换

c - scanf 字符指针中的字符串