关于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 那样。


以上是关于C++中的#include机制的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>