#ifndef #define 指令是什么意思

what does mean #ifndef #define directive

本文关键字:意思 是什么 指令 #define #ifndef      更新时间:2023-10-16

我是 c++ 的新手。当我创建一个头文件 Arme.h 时,我会自动收到这些指令

#ifndef DEF_ARME
#define DEF_ARME 

这些是什么意思,重要吗?

#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

是一个条件,(就像任何"如果那么"构造一样)需要结束,在这种情况下

#endif

#ifndef = 如果未定义

#define = 定义

还记得:

#include = 表现得好像命名文件的内容已复制并粘贴到此处

因此,净效果是使用如下代码:

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

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

通常,否则实际发生的情况更像是:

#include "A.h"
#include "B.h"
/* but B.h says:
   #include "A.h"
*/

因此,您要避免的是编译器在包含依赖项的任何位置的潜在双重声明错误甚至稍微复杂。

标头保护所做的只是只允许包含一次标头。如果多次包含它们,则只会忽略它们。因此,在头文件的顶部定义它将确保它只包含在程序中一次。

它是头文件中常用的构造。为了防止 #including 多个头文件,你放置 #ifndef 并 #define 特定于此头文件的"某些东西"。下次您尝试包含相同的标头时,您的"某些内容"将已经定义并阻止包含。

希望对您有所帮助。

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

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"

[注释]

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