系统头文件中的条件编译(如<sys/types.h>
)如何控制编译过程的问题让我困惑了很久
例如,这是 <sys/types.h>
中的一个常见 typedef 代码片段:
# if __WORDSIZE == 64
typedef long int int64_t;
# elif __GLIBC_HAVE_LONG_LONG
__extension__ typedef long long int int64_t;
# endif
# endif
也就是说,如果__WORDSIZE == 64
, 然后我们定义类型 int64_t
作为 long int
的一个别名, 但我想知道在哪里可以找到 __WORDSIZE
的定义.
- 拥有
__WORDSIZE
的宏在某些文件中静态定义?如果 那么,这个文件是如何生成的? - 或者,我们将预处理器宏传递给编译器?
- 或者,编译器知道它运行在什么样的机器上?但它怎么知道的?
毕竟我怎么写一个头文件就可以实现下面的意图:
#if the machine is 64-bit
typedef unsigned long int KEY_TYPE
#elif the machine is 32-bit
typedef unsigned long long int KEY_TYPE
#endif
最佳答案
这取决于编译器和系统。它 (__WORDSIZE
) 可能被编译器定义为内置宏(可能会根据编译器选项而改变),或者它可能位于系统头文件中。阅读系统 header 充其量是一项艰苦的工作;一般来说,您不应该试图事后猜测其中的内容。
请注意,__WORDSIZE
位于为实现保留的命名空间中。只要它能正常工作,该实现就可以随心所欲地使用它。如果将代码绑定(bind)到 __WORDSIZE
,则在更改编译器版本、编译器品牌、操作系统版本、操作系统品牌时可能会遇到问题。
至于编译器如何检测它在什么系统上:那是编译器的问题。它旨在为特定系统(通常是主机系统,除非是交叉编译器)生成代码。编译器被设置为知道如何正确编译代码;如何创建 32 位目标代码或程序,以及如何创建 64 位目标代码或程序。如果它不知道如何正确地创建代码,它作为编译器就没有多大用处,不是吗?
您可以通过以下方式实现您的目标:
// #include <stdint.h> // C header
#include <cstdint> // C++ analogue of <stdint.h>
typedef uint64_t KEY_TYPE;
代码中没有条件编译——这是编写代码的最佳方式。
(注意:从技术上讲,uint64_t
是可选类型。但是,无论它是否不可用,您都会遇到问题。)
关于c++ - 系统头文件中的条件编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27053343/