2013-07-03 7 views
14

小さな質問: C++のプログラムでCヘッダファイルを使用できますか?C++でのCコードの使い方

これは奇妙な質問かもしれませんが、基本的にはC++で他のプログラム(C言語で作成)のソースコードを使用する必要があります。一般的に両方のヘッダファイルに違いはありますか?たぶん私はいくつかのライブラリを変更する場合... 私はあなたが私を助けることを願っています。

+1

CとC++を混在させたC++ FAQのこのセクションは役立ちます:http://www.parashift.com/c++-faq/mixing-c-and-cpp.html –

+0

C++ FAQのリンクを更新しました:https:/ /isocpp.org/wiki/faq/mixing-c-and-cpp – Phlucious

答えて

25

はい、CヘッダーをC++コードに含めることができます。 CおよびC++ではないとして扱われるべきであるC++コンパイラは、など、その関数の宣言を知っているように、

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

// C header here 

#ifdef __cplusplus 
} 
#endif 

:それは、これを追加することが普通です。

extern "C" { 
#include "c-header.h" 
} 

多くのCヘッダーはこれら#if defined __cplusplusに包まれ、すでに含まれている:

+0

うわー、私はそれを知らなかった。とても素晴らしいです、ありがとう! – SadSeven

+10

「このコードをCとしてコンパイルする」という意味ではありません。括弧間のすべてのシンボルにCリンケージがあることを意味します(特に、C++ *ネームマングリング*を実行しないことを意味します)。 – Medinoc

6

はい、いますが、ヘッダからの宣言は、CはC++コンパイラに指示する必要があります。それはおそらく少し奇妙です(CヘッダーのC++構文)が、それはしばしば便宜のために行われます。

11

Cコードをプロジェクトの一部として一緒にコンパイルする場合は、C++コードでヘッダーファイルをインクルードし、C++コンパイラモードを使用してコードをコンパイルする必要があります。いくつかのCコードはC++コンパイラで「きれいに」コンパイルされません(例えば、mallocの使用にはキャストが必要です)。

オンの場合、ライブラリやプロジェクトの一部ではない他のコードがある場合は、ヘッダがextern "C"とマークされていることを確認する必要があります。そうでなければ、コンパイルされた名前の関数が適用されますが、これはCコンパイラが使用する命名規則と一致しません。

二つのオプションは、どちらかあなたが

#ifdef __cplusplus 
extern "C" { 
#endif 

... original content of headerfile goes here. 

#ifdef __cplusplus 
} 
#endif 

それとも、あなたはこれらのヘッダを編集する可能性を持っていない場合は、このフォームを使用することができますを追加し、ヘッダファイル自体を編集して、ここにあります

#ifdef __cplusplus 
extern "C" { 
#endif 
#include <c_header.h>" 
#ifdef __cplusplus 
} 
#endif 
関連する問題