繁体   English   中英

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

[英]How to prevent clang from automatically including header files?

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

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

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

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

C ++标头可以包括其他C ++标头。 C ++标头应提供在其提要中出现的声明和定义。 提要中显示为包括其他C ++头的C ++头应提供出现在那些其他头的提要中的声明和定义。

在多个标头中定义了某些类型和宏。 每个这样的实体应被定义为使得定义该实体的任何报头可以被包含在也定义该实体的任何其他报头之后(3.2)。

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

除了其他标头包含的标头之外,还有一个事实是C ++标头可能会或可能不会引入全局名称,而C标头可能会或可能不会引入名称空间std名称。 我见过很多人建议“这是C ++,您应该使用<cxyz>而不是xyz.h ”。 这个建议是误导的 这两个标头没有提供相同的定义,因此包含C ++标头不能简单地替换包含C标头。 是否应重写所有代码以使用C ++限定名称,尚有待商...……但这是更改include的先决条件。


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM