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.h
和 func2.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”。如果头文件多次 #include
d,它会阻止重新定义。
这是 C++ 的东西。它与 makefile 无关。
在头文件 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.h
和 func2.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”。如果头文件多次 #include
d,它会阻止重新定义。
这是 C++ 的东西。它与 makefile 无关。