在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++包含标准库标头,在任何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 标头,*.h
和 c*
之间的唯一区别是前者不需要将其标识符添加到 std
命名空间(无论是否这样做都是可选的),而后者需要这样做(也可以选择将它们添加到全局命名空间中)。没有其他区别。您不应该在 extern "C"
块中包含标准的 *.h
标头,因为标头本身会在需要时使用 C 链接。
如果要从C++代码中包含非标准 C 标头,则必须检查这些标头,以确定是否需要根据具体情况extern "C"
包含它们。
相关文章:
- 在函数内部的声明中初始化数组,并在外部使用它
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 节俭并发:未解决的外部问题
- 如何在c++中从git建立外部库
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 具有外部"c"和程序集的未定义函数
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 在C++中使用 gRPC 时未解析的外部符号
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 调用外部函数,无法指定类型 C++/MVS
- 同时具有"外部"和"内联"说明符的变量
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta