C++ 在C+中,“目的”使用了什么+;

C++ 在C+中,“目的”使用了什么+;,c++,visual-studio,C++,Visual Studio,在我的项目代码中,我发现有人在代码中使用了#ifdef和#if。我想知道使用它们的目的是什么?据我所知,它告诉预处理器在代码内部不会做任何事情。下面的代码给出了两个使用它们的示例。我试图找到测试目的的定义(真/假),但找不到。在下面的代码中,如何在#ifdef TEST_PURPOSE中执行某些操作?我正在使用visual studio 2012 #ifdef TEST_PURPOSE int i=1; printf("Something %d,"i); #endif #if

在我的项目代码中,我发现有人在代码中使用了
#ifdef
#if
。我想知道使用它们的目的是什么?据我所知,它告诉预处理器在代码内部不会做任何事情。下面的代码给出了两个使用它们的示例。我试图找到
测试目的的定义(真/假),但找不到。在下面的代码中,如何在
#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
是指如果定义的话。如果使用先前的源代码中的#define或使用编译器命令行参数定义了
#ifdef
后面的符号,则预处理器将包含直到封闭的#endif的文本,并因此进行编译


#if
的工作原理类似,但它会计算后面的布尔表达式。如果该表达式为真,则包含直到所包含的
#endif
的代码。

这些是预编译器指令。C++预编译器,最初是从C(不确定它现在是否不同)允许你根据编译器定义的变量或常数来改变编译器所看到的文本。 我肯定你见过头球后卫

#ifndef X_H
#define X_H

...

#endif
这样可以防止多次包含标题

这些都是一样的。如果您定义了
测试目的
(由
定义测试目的
),您将获得受
\ifdef测试目的
保护的代码块。
#if 0
将永远不会包括在内,并且可能也用于测试

#if 0
...
#endif
是从编译中排除大块代码的一种方法。这就像一大块注释掉的代码

#ifdef TEST_PURPOSE
...
#endif
另一方面,包含基于是否定义了前置处理器宏
测试目的
而包括/排除的代码

如何在
#ifdef测试(目的

这很简单:定义
测试目的
。执行此操作的典型位置是作为命令行参数,修改公共头文件,或者在适当的情况下,在包含出现在其中的头文件之前进行定义。

\ifdef
检查后面的名称是否是
\define
d。如果检查失败,将忽略
#ifdef
#endif
之间的代码

可以通过在
\ifdef
之前明确写入
\define TEST\u PURPOSE
或将
/D“TEST\u PURPOSE”
作为参数传递给MSVC编译器来完成检查。在使用Visual Studio的情况下,这可以在项目配置中设置,以便您可以轻松地打开和关闭它。

\ifdef
如果是预处理器指令,则在编译代码之前对它们进行评估。
预处理器指令有很多用途, 在您的示例中:
#ifdef
#if
用于在编译时包括或排除代码的某些部分

Emphasis:在构建过程中不完全存在中被排除
在非活动的预处理器块中可能会出现胡言乱语

注意
#如果定义(A)
#如果定义A
相同,因此我将仅参考
#如果

使用1-禁用通过链包含处理相同的头文件。 最常用的是“标题保护”:
通过
#include
链,您可能会重新输入同一个H文件并产生无法预料的现象,因此,使用以下构造是非常常见的

#if !defined(MyHeader_H)
#define MyHeader_H

...

#endif
在开始时,
MyHeader\u H
不会被定义,而是会被处理, 包括
MyHeader\u H

在随后的调用中,
#ifndef MyHeader_H
false,并且H文件不会包含在模块中

使用2-定义配置 有些项目有几种配置,比如说使用不同的硬件类型或一些不同的行为

您可以编写smth,如:

#if defined(FLASH_TYPE_A)
code to use flash type A
#elif defined (FLASH_TYPE_B)
code to use flash type B
#else 
ASSERT("NO FLASH TYPE DEFINED!");
#endif
在此代码中,您可以在编译过程中使用
/dFLASH\u TYPE\u A
/dFLASH\u TYPE\u B
来定义将包含哪些代码

注意:使用标准
if()
语句,
在本例中,二进制文件中只包含一个代码


有更多的用途,但我认为这些是最常见的

ifdef的含义是,只有定义了所述的预处理器宏,块内的代码才会包含在编译中。类似地,
#if
意味着只有当表达式的计算结果为true时(将表达式中出现的未定义宏替换为0时),才会包含该块

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

现在,出于某种原因,C/C++使用了它。这些语言以线性顺序处理文件,因此在源代码后面出现的内容还不为人所知,而在其他源文件中出现的更为重要的内容也不为人所知。这意味着没有(好的)自动方式可以在另一个源文件中引用一个源文件中的符号,特别是如果您希望类型正确的话。这意味着您必须拥有原型和
extern
定义才能引用这些。在两个源文件应该共享数据类型(
struct
s和
enum
s)的情况下,也必须这样做

为了使其更实用,可以将这些文件放在头文件中,每个源文件都可以
#包含
(这基本上意味着将头文件插入实际编译器看到的内容中)。这很容易导致这样的情况:一个头文件包含另一个头文件,您可能会遇到
#ifndef HEADER_INCLUDED_
#define HEADER_INCLUDED_

// actual payload of the header file

#endif