Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 系统头文件中的条件编译_C++_Linux_Architecture_Conditional Compilation - Fatal编程技术网

C++ 系统头文件中的条件编译

C++ 系统头文件中的条件编译,c++,linux,architecture,conditional-compilation,C++,Linux,Architecture,Conditional Compilation,系统头文件(如)中的条件编译如何控制编译过程的问题长期困扰着我 例如,在中有一个常见的typedef代码片段: 也就是说,如果\uuuuWordSize==64,那么我们将类型int64\t定义为long int的一个别名,但我想知道\uuWordSize的定义在哪里 \uuu WORDSIZE的宏是否已在某个文件中静态定义?如果 那么,这个文件是如何生成的呢 或者,我们将预处理器宏传递给编译器 或者,编译器知道它在哪种机器上运行?但它怎么知道呢 毕竟,如何编写一个头文件来实现以下目的: #

系统头文件(如
)中的条件编译如何控制编译过程的问题长期困扰着我 例如,在
中有一个常见的typedef代码片段:

也就是说,如果
\uuuuWordSize==64
,那么我们将类型
int64\t
定义为
long int
的一个别名,但我想知道
\uuWordSize
的定义在哪里

  • \uuu 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

这取决于编译器和系统。它(
\uuuu WORDSIZE
)可以由编译器定义为内置宏(根据编译器选项的不同而变化),也可以位于系统头中。读取系统标题充其量是一项艰苦的工作;一般来说,你不应该再去猜测它们里面有什么

请注意,
\uuuuuWordSize
位于为实现保留的命名空间中。只要工作正常,实现就可以随心所欲。如果您将代码绑定到
\uuuu字号
,则在更改编译器版本、编译器品牌、操作系统版本、操作系统品牌时可能会遇到问题

至于编译器如何检测它在哪个系统上:这是编译器的问题。它是为特定系统(通常是主机系统,除非它是交叉编译器)生成代码而构建的。编译器被设置为知道如何正确编译代码;如何创建32位目标代码或程序,以及如何创建64位目标代码或程序。如果它不知道如何正确地创建代码,那么它作为编译器就没有多大用处,是吗

您可以通过以下方式实现您的目标:

// #include <stdint.h> // C header
#include <cstdint>     // C++ analogue of <stdint.h>

typedef uint64_t KEY_TYPE;
/\include//C头
包含//C++模拟的
typedef uint64_t KEY_TYPE;
代码中没有条件编译-这是编写代码的最佳方式


(注意:从技术上讲,
uint64\u t
是一种可选类型。但是,无论它是否可用,您都会遇到问题。)

要发现gcc内置定义(在编译任何文件之前),请尝试使用:

gcc-std=c++11-E-p-v-dD temp.cpp

(temp.cpp只需要是一个空文件)

将-std=c++11更改为所需的标准

其中一些内置定义将用于控制系统头文件的编译


一些内置定义仅供内部(gcc)使用。您需要查阅gcc文档,以发现哪些内置定义可以在您的gcc版本中使用

谁控制编译器选项?你的意思是编译器会根据安装的计算机类型给_字号下不同的定义吗?但是,编译器如何知道机器的特性呢?我们是否需要人为地提供这些功能选项?但我不记得我在我的机器上安装gcc编译器时做过这件事。在我的机器上,我经常使用gcc。我可以使用
gcc-m64
生成64位目标代码,使用
gcc-m32
生成32位代码,每次运行相同的编译器。如果我尝试在Linux机器上使用Mac OS X编译器,它不会运行,反之亦然,因此是的,编译器知道它安装在哪种机器类型上。构建为64位二进制文件的编译器也不会在仅支持32位二进制文件的计算机上运行。因此,您(运行编译器的人)控制编译器选项,尽管如果您不重写它们,编译器将使用默认值。顺便说一下,我还想知道系统头文件和gcc编译器头文件之间的关系。它们之间有依赖关系吗?谁创建了系统头文件?安装Linux操作系统的过程是否总是包含系统头文件创建?GCC在可能的情况下使用系统头文件,但它包含一个步骤
fixincludes
,该步骤修复了它在系统头文件中发现的各种问题,创建了它自己的麻烦系统头文件的私有变体。系统标头由构建系统的人员交付。有些是内核头;有些则不然。那些不是的可能随系统的C库一起提供。安装Linux不一定要安装系统头。您必须安装开发系统(C编译器和相关软件包)以获取核心头文件,并安装特定软件包以获取相应的头文件。
// #include <stdint.h> // C header
#include <cstdint>     // C++ analogue of <stdint.h>

typedef uint64_t KEY_TYPE;