是什么意思#ifndef #define指令

时间:2014-03-31 18:58:45

标签: c++ c g++ directive

我是c ++的新手。当我创建头文件Arme.h时,我自动获得这些指令

#ifndef DEF_ARME
#define DEF_ARME 

这些意味着什么并且重要?

5 个答案:

答案 0 :(得分:7)

#ifndef 

表示:“如果没有定义”

#define DEF_ARME 

说明一下:这里定义了“空宏”“DEF_ARME”。我们可以在头文件中经常看到这种结构:你的整个头文件将包含在这些中:

#ifndef HEADER_NAME
#define HEADER_NAME

(here the code you want to include only once, as is general the case for headers)

#endif

这样:第一次包含头文件时,宏“HEADER_NAME”尚未定义,因此将定义它并包含头代码。如果您稍后包含相同的标头,则会定义HEADER_NAME,因此不会再包含相同的代码。

注意:预处理程序指令

#ifndef

是一个条件,(就像任何“if then”结构一样,需要结束,在这种情况下

#endif

答案 1 :(得分:3)

#ifndef =如果未定义

#define = define

还记得:

#include =表示好像已经复制并粘贴了指定文件的内容

所以净效果是代码如:

#include "A.h"
#include "A.h"

第一个执行#define,然后第二个拒绝根据#ifndef插入同一文本的第二个副本。

通常实际发生的事情更像是:

#include "A.h"
#include "B.h"

/* but B.h says:

   #include "A.h"

*/

所以你要避免的是来自编译器的潜在双重声明错误,其中任何包含依赖关系的地方都会有些复杂。

答案 2 :(得分:0)

所有标题保护程序都只允许您的标题包含一次。如果他们被多次包括在内,他们就会被忽略。 因此,在头文件的顶部定义它将确保它只包含在程序中一次。

答案 3 :(得分:0)

这是头文件中常用的结构。要防止#including多个头文件,请将#ifndef和#define'某些东西'放在特定于此头文件的位置。下次尝试包含相同的标题时,您的“内容”将被定义并阻止包含。

希望它有所帮助。

答案 4 :(得分:0)

您可以通过这些宏在编译时设置源代码,如:

1.使用指定的功能版本

int factorial1(int n) 
 { 
 if (n<=1) return 1;
 return n*factorial1(n-1);
 }

int factorial2(int n) 
 {
 int f,i;
 for (f=1,i=2;i<=n;i++) f*=i;
 return f;
 }

#define factorial(n) factorial1(n)
//#define factorial(n) factorial2(n)

void main()
 {
 int i=factorial(10);
 }

2.避免多个包含(如果你有全局变量,那就很好)

// this will avoid text below if _pi_h is already defined ... ie pi.h is already included
#ifndef _pi_h
// this will define global token _pi_h which means that file pi.h is already included
#define _pi_h

// global viariable
double pi=3.1415926535897932384626433832795;

// end of ifndef
#endif

// now you can do this without error (very handy for nested includes...)
#include "pi.h"
#include "pi.h"
#include "pi.h"

[注释]

  • 使用宏可以做很多事情,比如打开/关闭部分代码,如果定义了一些标记
  • 例如,你有游戏,想要一些调试图,而不是最终应用
  • 然后只需使用define ...就像在pi.h示例中一样