在C+中包含C头+;名称空间-这是标准行为吗? 我相信C头文件必须包含在C++程序的顶层。 无论如何,我意外地发现C++允许在子命名空间中包含C头。 namespace AAA { extern "C" { #include "sqlite3.h" // C API. } }

在C+中包含C头+;名称空间-这是标准行为吗? 我相信C头文件必须包含在C++程序的顶层。 无论如何,我意外地发现C++允许在子命名空间中包含C头。 namespace AAA { extern "C" { #include "sqlite3.h" // C API. } },c++,c,C++,C,然后,所有C类型和函数都将被放置在名称空间中。更有趣的是,所有链接的C函数也都在工作我还发现这可能会导致一些预处理器问题,但除此之外,它似乎工作得很好 这是标准行为吗?(我使用的是Clang 3.x)如果是,这个功能的名称是什么?我在哪里可以找到标准中提到的这个功能?你甚至可以做一些奇怪的事情,比如 //test.c int #include "main.h" { return 1; } //main.h main(void) 在进行任何语法检查之前,将展开预处理器宏。上面的

然后,所有C类型和函数都将被放置在名称空间中。更有趣的是,所有链接的C函数也都在工作我还发现这可能会导致一些预处理器问题,但除此之外,它似乎工作得很好


这是标准行为吗?(我使用的是Clang 3.x)如果是,这个功能的名称是什么?我在哪里可以找到标准中提到的这个功能?

你甚至可以做一些奇怪的事情,比如

//test.c
int
    #include "main.h"
{
    return 1;
}

//main.h
main(void)
在进行任何语法检查之前,将展开预处理器宏。上面的示例将扩展到

int
main(void)
{
    return 1;
}
这是法律法规。虽然您确实应该避免此类示例,但在某些情况下,将其包含到另一个元素中是非常有用的。在您的问题中,这取决于名称在编译过程中是如何损坏的。如果头文件中的所有定义都是用
extern“C”
声明的,那么将在目标文件中不混合地搜索名称,但是,如果包含实现的目标文件没有使用与其在使用代码中的定义相同的命名空间,并且没有声明它
extern“C”
,则情况并非如此

这是标准行为吗

<>是的——行为是由标准支持的,因为C++编译器实际上没有代码是“C”与“C++”的概念,除非当代码> Extn“C”<代码>用来抑制命名空间的窜改时。< /P> 不禁止损坏的结果是,如果您尝试链接到定义标题中提到的行外符号(
extern
变量、函数)的C库,则在链接时可能会出现“未解析符号”错误

如果是[标准功能],该功能的名称是什么?在哪里可以找到标准中提到的该功能

这只是
#include
工作方式的结果,这是在16.2源文件包含[cpp.include]中定义的,关键是:

[一个
#include
]导致用源文件的全部内容替换该指令,源文件的全部内容由“分隔符”之间的指定序列标识


因此,无论“C”头发生了什么,就好像周围的
名称空间
/
外部
语句和大括号都存在于头文件的顶部和底部……到编译的下一阶段开始时,源代码的确切来源已经无关紧要了(显示与源文件正确相关的错误消息的目的除外).

#include
基本上只是复制和粘贴。因此,只要该文件中的内容合法地符合名称空间,就编译器而言,这是很好的。同样,宏只是文本替换,您也可以使用编译器的
cpp
独立实用程序或
-E
标志(GCC和CLang都支持它)来获取“处理过的源(即所有的“包含”都被注入,所有宏和“αIFIFS”都被解析)。所以如果预处理器给出了一个有效的C++,那么就这样。如果没有,你必须处理它。我更新了这个问题来添加缺失点。所有的链接函数也都很好。“为什么?”他们在一个外部C中。“阻止,使他们的链接是未损坏的标准C材料。