gpt4 book ai didi

c++ - C++ 中#ifdef 和#if 的用途是什么

转载 作者:太空狗 更新时间:2023-10-29 23:32:39 24 4
gpt4 key购买 nike

在我的项目代码中,发现有人在代码中使用了#ifdef#if。我想知道使用它们的目的是什么?据我所知,它告诉预处理器不会在该代码中执行任何操作。下面的代码给出了两个使用它们的例子。我试图找到 TEST_PURPOSE (true/false) 的定义,但找不到。从下面的代码中,如何在 #ifdef TEST_PURPOSE 中做一些事情?我正在使用 visual studio 2012

#ifdef TEST_PURPOSE
int i=1;
printf("Something %d,"i);
#endif

#if 0
int i=1;
printf("Something %d,"i);
#endif

最佳答案

#ifdef的意思是,只有定义了上述预处理器宏, block 内的代码才会被编译。类似地,#if 表示只有当表达式的计算结果为真时才会包含该 block (当用 0 替换表达式中出现的未定义宏时)。

这里的一个要点是预处理器在源代码编译之前对其进行处理,如果不包含该 block ,则实际编译器根本不会对其进行解析。这是构造的一个重要特征。

现在由于某些原因 C/C++ 使用它。这些语言以线性顺序处理文件,因此出现在源代码下方的内容尚不清楚,而更重要的内容出现在其他源文件中。这意味着没有(好的)自动方法可以在另一个源文件中引用一个源文件中的符号,特别是如果您希望类型正确。这意味着您必须拥有原型(prototype)和 extern 定义才能引用它们。此外,如果两个源文件应共享数据类型(structenum),则必须这样做。

为了使其更实用,可以将它们放在一个头文件中,每个源文件都可以#include(这基本上意味着将头文件插入到实际编译器看到的内容中)。这反过来很容易导致一个头文件包含另一个头文件的情况,您可能会遇到同一个文件被包含两次的情况。由于重复 struct 定义是无效的,因此需要确保同一个头文件没有被定义两次——这就是 #ifndef 在 include-guard 中派上用场的地方:

#ifndef HEADER_INCLUDED_
#define HEADER_INCLUDED_

// actual payload of the header file

#endif

此外,在文件的解析和编译需要很长时间的时候,这可能会导致加速,因为可以快速跳过 header 的有效负载(预处理阶段处理源代码的速度比实际编译阶段快得多) .

“需要”宏的另一个原因是早期的 C 编译器可能只是将代码直接翻译成汇编程序。您可以通过使用宏来避免函数调用,这会导致它的扩展将直接插入到现场并在那里生成代码,而不必进行函数调用。同样的事情适用于常量,否则它们将是必须在其他地方获取的变量,而不是直接放入生成的代码中。

第三个原因是条件编译的可能性。大多数编译器预定义了一组宏,旨在提供有关正在编译的系统的信息。例如,我们有宏 _WIN32,它仅在您为 Windows 编译时才定义。这将使一个代码片段只包含在 Windows 中,而另一个则包含在另一个平台上。大多数编译器还可以从命令行设置自定义宏,这意味着可以从命令行(在 visual studio 中,您也可以在项目设置中更改它们)更改将编译的部分。最引人注目的此类宏是 NDEBUG 宏,如果定义该宏,它将禁用所有 assert - 在编译发布版本时添加 /DNDEBUG 是正常的.

关于c++ - C++ 中#ifdef 和#if 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117233/

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