我是否需要一个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)
标准没有指定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.
| 归档时间: |
|
| 查看次数: |
7411 次 |
| 最近记录: |