在C命名空间中包含C头是否是标准行为?

我相信C头文件必须包含在C程序的顶层。
无论如何,我不小心发现C允许在子命名空间中包含C头。

namespace AAA {
    extern "C" {
        #include "sqlite3.h"     // C API.
    }
}

然后,所有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”。

翻译自:https://stackoverflow.com/questions/21521333/including-c-headers-in-a-c-namespace-is-it-a-standard-behavior

转载注明原文:在C命名空间中包含C头是否是标准行为?