如何防止 clang 自动包含头文件
How to prevent clang from automatically including header files?
我正在使用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 您不想要的标头的标头保护,但这有点脏。
- 使用mongocxx驱动程序时包含头文件问题
- 如何为包含头文件的目标编写生成文件?
- 如何在 CMakeLists.txt Qt Creator 中包含头文件?
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- 在生成文件先决条件中包含头文件的原因
- My Project的属性配置正确,但Visual Studio仍然无法打开包含头文件
- 在 PostgreSQL C 扩展中包含头文件
- 是否可以在C++中以间接方式包含头文件
- 是否需要包含头文件?
- 我收到未声明的标识符错误,但我已包含头文件?
- 为什么我们需要构建一个提升库,仅仅包含头文件还不够吗,因为提升是模板
- C++:当顺序真正重要时,如何保证在项目中包含头文件的顺序
- 如何在C++中包含头文件时错误地重载
- 我在C++中无效使用不完整的类型类错误,如何正确包含头文件?
- 虚幻引擎4.16,C++包含头文件
- C++多次包含头文件
- 令牌之前的预期类名 '{' - 包含头文件和 CPP 文件
- 在.cpp中包含头文件会导致令人讨厌的错误
- 如何列出用于在Qt项目中包含头文件的所有路径
- 尽管包含头文件,但仍找不到嵌套命名空间