我一直认为C头文件必须包含在C++程序的顶层。然而,我无意中发现C++允许在子命名空间中包含C头文件。
namespace AAA {
extern "C" {
#include "sqlite3.h" // C API.
}
}
然后,所有的C类型和函数将被放置在命名空间中。更有趣的是,所有链接的C函数也都在正常工作!我还发现这可能会导致一些预处理器问题,但除此之外,它似乎运行得很好。
这是标准行为吗?(我正在使用Clang 3.x)如果是,这个特性的名称是什么,我在标准中可以找到这个特性的位置在哪里?
#include
基本上就是复制粘贴。只要该文件中的内容在命名空间内合法,编译器就认为可以使用它。 - Brandincpp
独立实用程序或编译器的-E
标记(GCC 和 CLang 都支持它)来获取 "已处理源代码"(即所有 #include 均被注入,所有宏和 #ifdef 均被解析)。因此,如果预处理器提供了有效的 C++,那就没问题。如果没有,则必须以某种方式处理它。 - user3159253extern
到底是做什么的,而且在 C++ 中可以通过命名空间访问函数,所以我认为 C++ 对名称进行了混淆。 - eonil