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

What is the specified behavior of including a standard C header, in C++ code, inside a linkage-specification (extern "C", extern "C++")?

本文关键字:外部 C++ 是什么 标准 包含 代码 链接      更新时间:2023-10-16

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

#include <stdint.h>
int main() { }

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

extern "C" {
#include <stdint.h>
}
int main() { }

extern "C++" {
#include <stdint.h>
}
int main() { }

它是否指定了在这两种情况下应该发生的情况,还是实现定义的甚至未定义的?

C++11 17.6.2.3p1 说C++标准库标头将内容放入extern "C++",但我的初步解读是这不适用于像 <stdint.h> 这样的 C 标头。 C++11 17.6.2.2p3 表示标头只能在任何"外部声明"之外#include;这句话只出现在 C++11 的这个地方,所以我不确定它是否适用于这里。 (我假设C99对此无话可说。

(对于我的特定情况,使用 C++ 的 <c*> 标准标头不是一个选项,所以我真的只需要知道老式 C 标头的语义。

该标准没有说明不属于C++的 C 标头。在 C++-11 之前,stdint.h/cstdint 不属于C++。这取决于该标头在包含在代码中时的行为方式C++。

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

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