在头文件functions.h中,前两个语句定义了FUNCTIONS_H
(如果尚未定义(。有人能解释一下采取这种行动的原因吗?
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
void print();
int factorial(int);
int multiply(int, int);
#endif
您链接的文章根本不是关于Makefiles的,而是关于编译多源文件代码的。
这些所谓的人包括警卫。它们防止代码被不必要地多次包含。
如果未定义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
d,它将阻止重新定义。
这是一个C++的东西。它与makefile无关。