如何防止 clang 自动包含头文件

How to prevent clang from automatically including header files?

本文关键字:包含头 文件 何防止 clang      更新时间:2023-10-16

我正在使用MSVC与朋友合作,我正在使用clang。 我注意到的一件事是 clang 似乎会自动包含一些标准标头,而 MSVC 则不是。 例如,我只是分别使用了assert.h和math.h中的函数assert()和round()。

代码对我来说很好,没有明确包含标头 - 是否有开关可以关闭此行为? 它把我逼上了墙。 我希望有一个错误,除非我明确包含标题。

该标准允许标准头文件相互包含,或转发声明通常在其他文件中找到的项目...最有可能发生的事情是这些定义是由您包含的标头之一(直接或间接)提供的。

此行为符合标准,因此不幸的是,编写可移植代码需要使用多个编译器进行测试。

C++标头可能包括其他C++标头。 C++标题应提供其提要中出现的声明和定义。 在其提要中显示的C++标题包括其他C++标题,应提供出现在这些其他标题提要中的声明和定义。

某些类型和宏在多个标头中定义。 每个此类实体的定义应使定义它的任何标头可以包含在也定义它的任何其他标头之后(3.2)。

如17.6.1.2所述,C标准标头(D.5)应仅包括其相应的C++标准标头。

除了其他标头包含的标头之外,还有一个事实是,C++标头可能会也可能不会引入全局名称,而 C 标头可能会也可能不会在命名空间std中引入名称。 我看到很多人推荐"这很C++,你应该使用<cxyz>而不是xyz.h"。 这个建议是误导性的;这两个标头不提供相同的定义,因此包含 C++ 标头不能简单地替换包含 C 标头。 是否应该重写所有代码以使用C++限定名称是值得商榷的......但是是更改包含的先决条件。

<小时 />

可能对您有帮助的一件事是列出使用 gcc -M 实际使用的标头。 然后,可以决定是否应在代码中列出任何间接包含的标头。

标准标头可以相互包含。您不想包含的标头可能包含在您使用的另一个标头中。

在这种情况下,您可能需要在包含任何内容之前手动 #define 您不想要的标头的标头保护,但这有点脏。