C ++符号的范围

时间:2015-11-05 18:10:03

标签: c++ scope symbols

AFAIK,符号可用于防止多次解析。如果a.h和b.h都包含c.h,那么

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

会阻止c.h被“解析”(我认为这不是正确的词)不止一次。

但是,我见过类似

的内容
#ifdef WIN32
...

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

#define WIN32

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

5 个答案:

答案 0 :(得分:5)

有两种选择,其中不在代码中的那些可以来自:

  1. 当您开始编译代码时,编译器套件本身会将其设置为默认值。
  2. 在编译代码时(或IDE项目首选项,当您使用IDE时),您可以为编译器(或确切地说是预处理器)提供这些定义的列表。例如,在Visual Studio 2013中,您会发现那些当您打开项目>属性>配置属性> C / C ++>预处理器>预处理器定义)时。
  3. 通常,这些定义不仅用于您描述的原因(包括保护),还用于根据您开发的平台启用或禁用代码 - 例如,您可以只为Windows编译代码分支,或仅当您使用64位编译器时。

答案 1 :(得分:1)

您可能需要查看一些predefined compiler macros

Microsoft

答案 2 :(得分:1)

AFAIK这是您使用的编译器的一部分。

答案 3 :(得分:1)

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

此外,您的术语有点偏离 - 这些被称为预处理器宏,而不是符号。代码中变量,函数等的名称是符号。

答案 4 :(得分:1)

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