C ++程序中的C头文件

时间:2014-10-23 13:59:56

标签: c++ c header

我知道C头文件可以在C ++程序中使用,前缀为' c'。 但是,我无法弄清楚为什么有人会这样做。是否有任何情况下C头更适合在c ++程序中使用?

2 个答案:

答案 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子句中包含此标头。