c++ - 系统头文件中的条件编译

标签 c++ linux architecture conditional-compilation

系统头文件中的条件编译(如<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/

相关文章:

iphone - 需要 iOS 核心数据架构技巧

c++ - 具有动态内存的命名管道策略?

c++ 二维数组作为私有(private)类变量

linux - DD img 不同的 MD5?

database - 数据库架构方面

c# - 如何使用 linq-to-sql 同时增加页面浏览量?

c++ - 如何从数组中删除 2 个连续的重复项? C++

c++ - 在函数之间传递时指针未更新

python - 使用scp批量传输文件

linux - Redis Windows fork 是否因为使用内存映射文件而使用更少的 RAM?