我正在和一位使用MSVC的朋友合作,而且我正在使用clang。我注意到的一件事是,clang似乎会自动包含一些标准标题,而MSVC则不然。例如,我刚刚分别使用assert.h和math.h中的assert()和round()函数。
在没有明确包含标题的情况下,代码对我来说很合适 - 是否有关闭此行为的开关?它把我推到了墙上。除非我明确包含标题,否则我希望出现错误。
答案 0 :(得分:4)
标准允许标准头文件相互包含,或者通常在其他文件中找到的转发声明项...很可能发生的事情是这些定义是由您<标题之一(直接或间接)提供的。 em> 包括。
此行为符合标准,因此遗憾的是编写可移植代码需要使用多个编译器进行测试。
C ++标头可能包含其他C ++标头。 C ++标头应提供其概要中出现的声明和定义。在其概要中显示的包含其他C ++头的C ++头应该提供出现在那些其他头的概要中的声明和定义。
某些类型和宏在多个标头中定义。每个这样的实体都应该被定义,以便任何定义它的头可以包含在任何其他定义它的头之后(3.2)。
C标准头文件(D.5)应仅包括其对应的C ++标准头文件,如17.6.1.2中所述。
除了其他标头包含的标头之外,还有C ++标头可能引入或不引入全局名称的事实,而C标头可能会也可能不会在名称空间std
中引入名称。我见过很多人推荐&#34;这是C ++,你应该使用<cxyz>
而不是xyz.h
&#34;。这个建议误导;两个标头不提供相同的定义,因此C ++标头的包含不能简单地替换C标头的包含。是否应该重写所有代码以使用C ++限定名称是有争议的......但这是更改包含的先决条件。
可以帮助您的一件事是列出使用gcc -M
实际使用的标头。然后,您可以决定是否应在代码中列出任何间接包含的标题。
答案 1 :(得分:0)
标准标题可以包含彼此。您希望不包含的标头可能包含在您使用的另一个标头中。
在这种情况下,您可能需要在包含任何内容之前手动#define您不想要的标题的标题保护,但这有点脏。