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.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...
如您所见,如果没有包含守卫,函数的原型将第二次出现。可能还有其他重要的事情,重新定义会导致错误。
【讨论】:
【参考方案2】:这是一个“包含守卫”。如果头文件多次为#include
d,它会阻止重新定义。
这是一个 C++ 的东西。它与 makefile 无关。
【讨论】:
以上是关于functions.h 中的 `#ifndef FUNCTIONS_H` 是啥?的主要内容,如果未能解决你的问题,请参考以下文章