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
在整个项目中返回空。我的问题是:这些符号实际定义在哪里?操作系统是否保留了类似于不同程序可用于查询操作系统或其他进程属性的符号池的内容?
答案 0 :(得分:5)
有两种选择,其中不在代码中的那些可以来自:
通常,这些定义不仅用于您描述的原因(包括保护),还用于根据您开发的平台启用或禁用代码 - 例如,您可以只为Windows编译代码分支,或仅当您使用64位编译器时。
答案 1 :(得分:1)
您可能需要查看一些predefined compiler macros
答案 2 :(得分:1)
AFAIK这是您使用的编译器的一部分。
答案 3 :(得分:1)
Microsoft C ++编译器在内部定义了一些宏,例如WIN32,这就是为什么它没有在任何特定的头中定义。因此,当您使用VC ++构建源文件时,IValueConverter
内的内容会被编译,但不会说Linux gcc。
此外,您的术语有点偏离 - 这些被称为预处理器宏,而不是符号。代码中变量,函数等的名称是符号。
答案 4 :(得分:1)
每个编译器都有一个已定义宏的列表。当编译目标是32位Windows时,MSVC定义WIN32。