functions.h 中的 `#ifndef FUNCTIONS_H` 是做什么用的?

What is `#ifndef FUNCTIONS_H` in functions.h for?

在头文件 functions.h 中,前两个语句正在定义 FUNCTIONS_H 如果尚未定义。有人可以解释此操作的原因吗?

#ifndef FUNCTIONS_H 
#define FUNCTIONS_H 

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

#endif 

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...

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

这是一个“include guard”。如果头文件多次 #included,它会阻止重新定义。

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