mat*_*ots 48 c c++ header-files
在C或C++中多次包含头文件是否有用?
如果从未使用过该机制,为什么编译器会担心包含两次文件; 如果真的没用,如果新的编译器确保每个标题只包含一次,那会不会更方便?
编辑:
我知道有一些标准的方法可以做一次包括警卫和编译指示在内的事情,但为什么你必须指定甚至呢?不应该只是编译器的默认行为只包含一次文件吗?
Pub*_*bby 30
是的,在使用预处理器生成代码或者像Boost.PP这样的技巧时,它很有用.
有关示例,请参阅X宏.基本的想法是文件包含宏的主体和你#define的参数然后#include它.这是一个人为的例子:
macro.xpp
std::cout << MESSAGE;
#undef MESSAGE
Run Code Online (Sandbox Code Playgroud)
file.cpp:
int main() {
# define MESSAGE "hello world"
# include "macro.xpp"
}
Run Code Online (Sandbox Code Playgroud)
这也允许你#if在参数上使用和朋友,这是普通宏不能做的事情.
Jer*_*fin 28
是的,包括一个标题不止一次可能是有用的(虽然它是相当不寻常的).规范示例是根据是否<assert.h>定义而asssert不同地NDEBUG定义的.因此,包含它是有意义的,然后有一个(通常是条件性的)NDEBUG定义,然后再次包含它,(至少可能)不同的定义assert:
所述
assert宏是根据当前的状态重新定义NDEBUG每个时间<assert.h>包含1.
然而,大多数标题都会出于某种意义上的幂等(即,无论它们包含多少次都具有相同的效果).
1 C99,§7.2/ 1.
Ton*_*roy 14
一个典型的例子(未经测试) - 重点在于它会对枚举列表进行因子分析,因此它们enum在流式代码中一致地出现:
// states.h
X(Uninitialised)
X(Initialised)
X(Running)
X(Complete)
X(Shutdown)
// app.c++
#if defined(X)
# error X is already defined
#endif
enum States {
#define X(TAG) TAG,
#include "states.h"
#undef X
Extra_So_Trailing_Comma_Ignored
};
std::ostream& operator<<(std::ostream& os, const States& state)
{
#define X(TAG) if (state == TAG) return os << #TAG;
#include "states.h"
#undef X
return os << "<Invalid-State>";
}
Run Code Online (Sandbox Code Playgroud)
是的,只包含一次会更方便,这就是您使用 #pragma Once 的原因。在 C++ 中:)
编辑:
注意:#pragma Once 是不可移植的。您可以使用
#ifndef FILENAME_H
#define FILENAME_H
Run Code Online (Sandbox Code Playgroud)
如果您希望它是可移植的,则应放在头文件的顶部。
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |