functions.h 中的 `#ifndef FUNCTIONS_H` 是啥?

Posted

技术标签:

【中文标题】functions.h 中的 `#ifndef FUNCTIONS_H` 是啥?【英文标题】:What is `#ifndef FUNCTIONS_H` in functions.h for?functions.h 中的 `#ifndef FUNCTIONS_H` 是什么? 【发布时间】:2020-07-17 04:05:22 【问题描述】:

在头文件functions.h中,前两个语句定义FUNCTIONS_H(如果尚未定义)。有人能解释一下这个动作的原因吗?

#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

void print(); 
int factorial(int); 
int multiply(int, int); 

#endif 

【问题讨论】:

【参考方案1】:

article you linked 根本不是关于 Makefile,而是关于编译多源文件代码。

那些所谓的包含警卫。它们可以防止不必要地多次包含代码。

如果未定义FUNCTIONS_H,则包含文件内容并定义此宏。否则,它被定义为已经包含文件。

还有#pragma once 服务于相同的目的,虽然不在标准中,但许多主要编译器都支持。

考虑例子:

还有两个下一个头文件 - func1.hfunc2.h。两者都有#include "functions.h"

如果在main.cpp 我们这样做:

#include "func1.h"
#include "func2.h"

// rest of main...

代码将被预处理为:

#include "functions.h"
// rest of func1.h

#include "functions.h"
// rest of func2.h

// main...

然后:

#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

void print(); 
int factorial(int); 
int multiply(int, int); 

#endif 
// rest of func1.h


#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

void print(); 
int factorial(int); 
int multiply(int, int); 

#endif 
// rest of func2.h

// main...

如您所见,如果没有包含守卫,函数的原型将第二次出现。可能还有其他重要的事情,重新定义会导致错误。

【讨论】:

【参考方案2】:

这是一个“包含守卫”。如果头文件多次为#included,它会阻止重新定义。

这是一个 C++ 的东西。它与 makefile 无关。

【讨论】:

以上是关于functions.h 中的 `#ifndef FUNCTIONS_H` 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

makefile 中未定义的引用

重建预编译头文件

ifndef系列

CMakeLists.txt 结构

#ifndef #define #endif 的用法

c语言中的 #ifndef#def#endif等宏的意思