我是c ++的新手。当我创建头文件Arme.h时,我自动获得这些指令
#ifndef DEF_ARME
#define DEF_ARME
这些意味着什么并且重要?
答案 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"
[注释]