在C++代码中,在链接规范(extern"C",extern"C++")中包含标准C头的指定行为是什么?

Jef*_*den 5 c c++ header-files linkage

通常,在全局命名空间中包含C++中的标准库头,在任何externs 之外,如下所示:

#include <stdint.h>

int main() { }
Run Code Online (Sandbox Code Playgroud)

但是如果在一个标准库头中包含标准库头,那么会发生什么?例如:

extern "C" {
#include <stdint.h>
}
int main() { }
Run Code Online (Sandbox Code Playgroud)

要么

extern "C++" {
#include <stdint.h>
}
int main() { }
Run Code Online (Sandbox Code Playgroud)

它是否指定了在任何一种情况下应该发生什么,或者它是实现定义的还是未定义的?

C++ 11 17.6.2.3p1说C++标准库头文件包含了东西extern "C++",但我的初步读物是这不适用于C头文件<stdint.h>.C++ 11 17.6.2.2p3表示标题只能在#include任何"外部声明"之外; 这个短语只出现在C++ 11中的这一个地方,所以我不确定它是否适用于此处.(我假设C99对此无话可说.)

(对于我的特殊情况,它不是使用C++ <c*>标准头文件的选项,所以我真的只需要知道旧版C头文件的语义.)

Nik*_* C. 5

该标准没有提及任何不属于C++的C头文件.在C++ - 11之前,stdint.h/ cstdint不是C++的一部分.这个标题取决于C++代码中的行为.

如果你问的 C++ 属于C++的C头,那么*.h和之间的唯一区别c*就是前者不需要将它的标识符添加到std命名空间(无论是否这样做都是可选的),而后者是必需的这样做(它也可以选择将它们添加到全局命名空间.)没有其他区别.您不应*.hextern "C"块内包含标准头,因为头文件本身会在需要时使用C链接.

如果您希望包含C++代码的非标准C头,则必须检查这些头以确定是否需要根据具体情况包含它们extern "C".