5

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

#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++11 17.6.2.2p3 说标头只能在#include任何“外部声明”之外;这个短语在 C++11 中只出现在这个地方,所以我不确定它是否适用于这里。(我假设 C99 对此无话可说。)

(对于我的特殊情况,不能选择使用 C++ 的<c*>标准头文件,所以我真的只需要知道老式 C 头文件的语义。)

4

1 回答 1

5

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

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

如果您有想要从 C++ 代码中包含的非标准 C 头文件,那么您必须检查这些头文件以确定是否需要extern "C"逐个包含它们。

于 2012-12-04T18:37:02.277 回答