我是否需要一个extern"C"块来包含标准C头?

Mar*_*tin 13 c++ posix-api

我是否需要一个extern "C" {}块来在C++程序中包含标准C头.只考虑在C++中没有对应项的标准C头.

例如:

extern "C" {
 #include <fcntl.h>
 #include <unistd.h>
}
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 16

系统C头通常已经包含一个extern "C"块,由守卫#ifdef __cplusplus.这样,函数会extern "C"在编译为C++时自动声明,并且您不需要手动执行此操作.

例如在我的系统上,unistd.h以及以... fcntl.h开头__BEGIN_DECLS和结尾__END_DECLS,这些是在sys/cdefs.h以下位置定义的宏:

/* C++ needs to know that types and declarations are C, not C++.  */
#ifdef   __cplusplus
# define __BEGIN_DECLS  extern "C" {                                            
# define __END_DECLS }
#else
# define __BEGIN_DECLS
# define __END_DECLS
#endif
Run Code Online (Sandbox Code Playgroud)


Nem*_*emo 9

标准没有指定C++中的<fcntl.h>和的行为<unistd.h>(因为它们也不是C89标准的一部分).也就是说,我从未见过他们(a)存在的平台,(b)实际上需要被包裹在一个extern "C"块中.

的行为<stdio.h>,<math.h>是由C++ 03标准的节D.5指定,另一个标准的C头.它们不需要extern "C"包装块,并将它们的符号转储到全局命名空间中.但是,附件D中的所有内容均已"弃用".

这些标题的规范C++形式是<cstdio>,<cmath>等等,它们由C++标准的第17.4.1.2(3)节规定,它表示:

<cassert> <ciso646> <csetjmp> <cstdio> <ctime> <cctype> <climits>
<csignal> <cstdlib> <cwchar> <cerrno> <clocale> <cstdarg> <cstring>
<cwctype>
Run Code Online (Sandbox Code Playgroud)

除了如条款18至27所指出的,每一个报头的CNAME的内容应是相同于相应的头name.h的,如在ISO指定/ IEC 9899:1990编程语言C(第7章),或ISO/IEC :1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内.但是,在C++标准库中,声明和定义(在C中定义为宏的名称除外)在命名空间std的命名空间范围(3.3.5)内.

因此,printf在C++中使用(例如)标准的,不推荐的,规范的方法是#include <cstdio>然后调用std::printf.