关于C++中的#include机制
最近我遇到了一些奇怪的代码,这绝对是一个不好的做法,但有点有趣。
例如,我有三个文件:
something.h
class Something
{
void func();
}
东西.cpp
void Something::func()
{
#define STRANGE() //do something
#include strange.h
return;
}
奇怪的.h
STRANGE()
那个STRANGE()在奇怪的.h 中调用的实际上运行了!
这让我对包含机制感到好奇,#include派生是否只是简单地获取包含文件中的所有内容并将它们放在#include编译之前?
如果这是真的,我什至可以切换 .cpp 和 .h 的角色,在 cpp 文件中声明,同时在 h 文件中实现。
回答
每个 C++ 标准([cpp.include]/3):
形式的预处理指令
# include " q-char-sequence " new-line导致用 " 分隔符之间的指定序列标识的源文件的全部内容替换该指令。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,指令被重新处理,就好像它读取
# include < h-char-sequence > new-line具有与原始指令相同的包含序列(包括 > 字符,如果有)。
所以你的问题的答案是:
这让我对包含机制感到好奇,#include 派生类是否只是简单地获取包含文件中的所有内容,然后在编译之前将它们放在 #include 中?
简直就是“是”。
关于文件的命名,正如有人在评论中指出的那样,扩展名只是文件名的一部分。它们在 C++ 编译器对文件的解释中没有任何作用。因此,您可以随意命名它们。您甚至可以不包括扩展名,就像 STL 那样。