C++ 符号的作用域

Scope of a C++ symbol

据我所知,符号对于防止多重解析很有用。如果 a.h 和 b.h 都包含 c.h,则

#ifndef C_H
#define C_H
...
// c.h definition would go here
...
#endif

将防止 c.h 不止一次成为 "parsed"(我认为这不是正确的词)。

但是,我看到了类似的东西

#ifdef WIN32
...

在别人的代码中。该符号必须已在其他地方定义,因为搜索

#define WIN32

在整个项目中 returns 为空。我的问题是:这些符号实际定义在哪里? OS 是否保留类似于不同程序可用于查询 OS 或其他进程属性的符号池的内容?

您可能想看一些 predefined compiler macros

Microsoft

据我所知,这是您使用的编译器的一部分。

Microsoft C++ 编译器在内部定义了一些宏,例如 WIN32,这就是为什么它没有在任何特定的头文件中定义的原因。因此,当您使用 VC++ 构建源文件时,#ifdef WIN32 中的内容会被编译,但不会编译 Linux gcc.

此外,您的命名有点不对——这些称为预处理器宏,而不是符号。代码中变量、函数等的名称都是符号。

每个编译器都有一个已定义宏的列表。当编译目标为 32 位时,MSVC 定义了 WIN32 Windows.

代码本身不存在的选项有两个来源:

  1. 当您开始编译代码时,编译器套件本身将其设置为默认值。
  2. 您在编译代码时为编译器(准确地说是预处理器)提供了这些定义的列表(或者当您使用 IDE 时,您的 IDE 项目首选项会提供这些定义的列表。例如,在 Visual Studio 2013 中,您会在打开项目 > 属性 > 配置属性 > C/C++ > 预处理器 > 预处理器定义时找到这些。

一般来说,这些定义不仅用于您描述的原因(包括守卫),还用于根据您开发的平台启用或禁用代码 - 例如,您可以只编译代码分支对于 windows,或者仅当您使用 64 位编译器时。