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头文件的语义.)
该标准没有提及任何不属于C++的C头文件.在C++ - 11之前,stdint.h/ cstdint不是C++的一部分.这个标题取决于C++代码中的行为.
如果你问的是 C++ 中属于C++的C头,那么*.h和之间的唯一区别c*就是前者不需要将它的标识符添加到std命名空间(无论是否这样做都是可选的),而后者是必需的这样做(它也可以选择将它们添加到全局命名空间.)没有其他区别.您不应*.h在extern "C"块内包含标准头,因为头文件本身会在需要时使用C链接.
如果您希望包含C++代码的非标准C头,则必须检查这些头以确定是否需要根据具体情况包含它们extern "C".
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |