gpt4 book ai didi

c++ - 为什么我们需要在 C++ 头文件中使用 "#if defined Identifier"?

转载 作者:行者123 更新时间:2023-11-30 21:48:30 26 4
gpt4 key购买 nike

我有一个 C++ 库头文件,它以以下代码行开头:

#if defined ARRAY_SIZE
#define TABLE_SIZE ARRAY_SIZE
#elif !defined BUFFER_SIZE
#define TABLE_SIZE 128
#else
#define TABLE_SIZE BUFFER_SIZE
#endif

我想知道:

  1. 为什么我们需要在头文件中使用这一行?
  2. 头文件是编写它们的最佳位置吗?或者图书馆是一个更好的文件? (我的意思是此 .h 文件使用的 .cpp 文件)
  3. 处理器在哪里搜索,以查看该标识符(在我们的示例中为 ARRAY_SIZEBUFFER_SIZE)是否已定义? (在主程序中?如果是,是在包含库之前的行中还是在整个主程序中?)

最佳答案

预处理器值由 -D 定义。命令行上的选项发送到编译器,或通过#define在前面的代码中(包括您发布的代码部分之前包含的头文件)。 defined预处理器功能只是返回 true (或解释为 true )当给定的名称已定义时,或 false当它还没有出现时。请注意,给定的名称必须由 #define 定义。 ,不是例如const int x = 4; #if defined(x) 则不成立。编辑:请注意defined从来不“期待”。想象一下旧式纸带或打洞卡,您只能知道您已经看到的内容,而不知道“ future ”磁带/卡片中的内容。

编辑:为了完整起见,我应该补充一点,还有由编译器完成的预处理器定义 - 这些定义提供了诸如处理器架构之类的内容( __i386__ 对于 32 位 x86 处理器, __ARM__ 对于 ARM 处理器、__x86_64__(对于 64 位 x86 处理器) - 通常会使用标志来识别处理器型号的更多详细信息,例如 __SSE____MMX__ 对于这些扩展)、操作系统(例如 __LINUX____WINDOWS__ -这些也可能有数值,允许您执行类似 #if __WINDOWS__ > 500 )以及编译器如 __MSVC__ 的操作。或__gnuc__ ,以及其他几十个或多或少神秘的内容 - 但这个问题中的代码片段中的内容不是其中之一。

如果不知道您正在查看哪个头文件,就无法解释为什么需要这样做。

关于c++ - 为什么我们需要在 C++ 头文件中使用 "#if defined Identifier"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com