我知道C头文件可以在C ++程序中使用,前缀为' c'。 但是,我无法弄清楚为什么有人会这样做。是否有任何情况下C头更适合在c ++程序中使用?
答案 0 :(得分:2)
您通常无需专门为标题命名。你可以做到
extern "C" {
#include "your-c-header.h"
}; // end extern C
甚至可以输入your-header.h
之类的内容
#ifdef __cplusplus
extern "C" {
#endif
/// the real content of your header goes here
#ifndef __cplusplus
}; // end extern C
#endif
当然,您还会添加通常的include guard。
C ++语言最初设计为C兼容(即使在今天,C ++ 11“大部分” - 但与“大多数”C99或C11不正式兼容)。所以这个技巧通常是 工作。但你应该知道C和C ++之间不兼容的极端情况(它取决于C和C ++的特定版本,甚至可能是您特定的实现和操作系统)。
BTW,C ++标准确实定义了一些标题名称,如<cstdio>
,但仅用于包装标准C标题(如<stdio.h>
)。对于其他标题(如POSIX,或者喜欢你喜欢的库中的标题),这不会系统地应用。
至于为什么包含C头在C ++代码中有用:你如何使用例如标准C API(如POSIX)没有这样做,或使用一些可用的API和库(例如GNU的<readline/readline.h>
或<gdbm.h>
或<ncurses.h>
)?
答案 1 :(得分:1)
使用C头的主要原因是与使用C编译器编译的一些代码进行互操作。您不能使用C ++标头,因为它们会生成不同的符号名称,因为C ++ name mangling。
例如,您有一个已编译的静态库和一个在C头中定义的函数:
void foo(int);
静态库中此函数的符号只是
foo
你正试图在C ++应用程序中使用这个库,但是C ++编译器会查找这个符号(在Visual C ++的情况下)
?foo@@YAXH@Z
因此,您将收到链接器错误。为了防止出现此错误,您需要在extern C
子句中包含此标头。