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