Jam*_*ame 13 c++ visual-studio
在我的项目代码中,我发现有人在代码中使用了#ifdefand 。#if我想知道使用它们的目的是什么?据我所知,它告诉预处理器不会在该代码内执行任何操作。下面的代码给出了两个使用它们的示例。我试图找到TEST_PURPOSE(真/假)的定义,但找不到。从下面的代码中,如何在里面做一些事情#ifdef TEST_PURPOSE?我使用的是视觉工作室2012
#ifdef TEST_PURPOSE
int i=1;
printf("Something %d,"i);
#endif
#if 0
int i=1;
printf("Something %d,"i);
#endif
Run Code Online (Sandbox Code Playgroud)
sky*_*ing 14
的含义#ifdef是,只有定义了上述预处理器宏,块内的代码才会包含在编译中。类似地#if,意味着仅当表达式计算结果为 true 时(当用 0 替换表达式中出现的未定义宏时)才会包含该块。
这里重要的一点是,预处理器在编译之前处理源代码,如果不包含该块,则实际编译器根本不会对其进行解析。这是该结构的一个重要特征。
现在由于某种原因 C/C++ 使用了它。这些语言以线性顺序处理文件,因此出现在源文件下方的内容尚不清楚,而更重要的内容出现在其他源文件中。这意味着没有(好的)自动方法可以在一个源文件中的符号在另一个源文件中引用,特别是如果您希望类型正确的话。这意味着您必须拥有原型和extern定义才能引用它们。struct此外,在两个源文件应共享数据类型( s 和s )的情况下,enum也必须这样做。
为了使其更加实用,可以将它们放入每个源文件可以使用的头文件中#include(这基本上意味着将头文件插入到实际编译器所看到的内容中)。这反过来很容易导致一个头文件包含另一个头文件的情况,并且您可能会遇到同一个文件被包含两次的情况。由于重复struct定义是无效的,因此需要确保同一个头文件没有定义两次 - 这就是#ifndefinclude-guard 中派上用场的地方:
#ifndef HEADER_INCLUDED_
#define HEADER_INCLUDED_
// actual payload of the header file
#endif
Run Code Online (Sandbox Code Playgroud)
此外,当文件的解析和编译需要很长时间时,这可能会导致加速,因为可以快速跳过标头的有效负载(预处理阶段处理源文件的速度比实际编译阶段快得多)。
“需要”宏的另一个原因是早期的 C 编译器可能只是直接将代码转换为汇编程序。您可以通过使用宏来避免函数调用,这将导致它的扩展将直接插入到该位置,并在那里生成代码,而不必执行函数调用。同样的事情也适用于常量,否则这些常量将是必须在其他地方获取的变量,而不是直接放入生成的代码中。
第三个原因是条件编译的可能性。大多数编译器预定义了一组宏,旨在提供有关正在编译的系统的信息。例如,我们_WIN32只有在为 Windows 进行编译时才定义宏。这样就可以有一个代码片段仅包含在 Windows 中,而另一个代码片段则包含在另一个平台上。大多数编译器还可以从命令行设置自定义宏,这意味着可以从命令行(在 Visual Studio 中,您也可以在项目设置中更改它们)更改将编译的部分。最引人注目的此类宏是NDEBUG如果定义了该宏将禁用所有s -在编译发布版本时assert添加 s 是正常的。/DNDEBUG
| 归档时间: |
|
| 查看次数: |
52072 次 |
| 最近记录: |