クラス用のチャットサーバーを書いています。Cのネットワークプロトコルを使用したいのですが、特に文字列操作の観点から、C++でのプログラミングの方が快適です。
私が理解しているように、2つを1つのファイルにまとめて、C ++用にコンパイルすることができ、適切な#includeが存在する限り、Cコードを受け入れます。
これにはどのような制限がありますか?何に注意すればいいですか?特にCから.cppファイルで機能しないものはありますか?
クラス用のチャットサーバーを書いています。Cのネットワークプロトコルを使用したいのですが、特に文字列操作の観点から、C++でのプログラミングの方が快適です。
私が理解しているように、2つを1つのファイルにまとめて、C ++用にコンパイルすることができ、適切な#includeが存在する限り、Cコードを受け入れます。
これにはどのような制限がありますか?何に注意すればいいですか?特にCから.cppファイルで機能しないものはありますか?
同じファイルで2つを組み合わせないでください。C ++としてコンパイルされるCを作成すると、Cの人々はあなたに怒鳴り、その逆も同様です。代わりに、小さなCライブラリを作成し、それに対してC++リンクを設定します。次に行う必要があるのは、追加することだけです。
#ifdef __cplusplus
extern "C" {
#endif
C libのヘッダーファイルの先頭、および
#ifdef __cplusplus
}
#endif
最後に。
それも簡単できれいです:Makefile
gnu makeを使用しているので、これを作成するのは本当に簡単です:
program: cstuff.o program.o
これで、runningmake
は次のコマンドを発行します。
cc -c cstuff.c
g++ -c program.cpp
cc cstuff.o program.o -o program
したがって、ディレクトリリストには4つのファイルがあります:program.cpp
cstuff.c
cstuff.h
とMakefile
。
cstuff.h
すべての構造体定義、関数プロトタイプ、およびそれらのものが含まれていますextern "C"
。cstuff.c
自明であり、program.cpp
ヘッダーファイルにリストされている関数を呼び出すことができることから始まり、#include "cstuff.h"
あなたが愛するすべてのC++-eyの良さを備えています。特別なことをすることなく、C++のネットワークヘッダーを含む標準ヘッダーを#includeして使用できるはずです。
CとC++にはいくつかの違いがありますが、それが原因で問題が発生する可能性はほとんどありません。
1つの違いは列挙型です。Cでは、列挙型は単なるintです。C ++では、列挙型は実際の型です。このコードは有効なCですが、無効なC++です。
enum sport {
hockey,
baseball,
soccer,
vollyball
};
enum sport s = 5;
これをg++でコンパイルすると、
test.c:11:エラー:「int」から「sport」への無効な変換</ p>
CとC++の混合に関する詳細は次のとおりです。
通常、CとC ++を混在させると、構文の最初の部分から後者がすべて継承された後、すべてがうまくいきます。
おそらく最も顕著な違いは、動的に割り当てられたメモリを明示的にキャストする必要があることです。
int *array = (int*) malloc(...)
これは、void*
Cでは任意のタイプのポインターに割り当てることができるためですが、C ++ではそうではありませんが、Cではそれを行う必要はありません。しかし、C ++では、mallocを回避し、直接newとdeleteを使用することができます。
いずれにせよ、ここを見てください。多くの違いが要約されていますが、それらはほとんどがほんのわずかなものです。
C ++は基本的に、OOP手法が追加されたCの更新バージョンです。したがって、それらを組み合わせるのは実際には問題ではありません。ほとんどのコンパイラはとにかく両方をサポートしているので、その場でそれらを組み合わせることができます。
「Cインターフェイス」を備えたすべてのライブラリは、C++コードで使用できます。最悪の場合、extern "C" { ... }
囲まれたシンボルの「外部リンケージ」がC++ではなくCであると指定するために追加する必要があります。最良の場合、そのライブラリを使用するヘッダーは、C ++コード内で使用される可能性をすでに考慮しているため、それをインクルードしてから、Cで行うのと同じようにそのライブラリの関数を使用するだけです。
あなたの場合(「net」/ sockets関数)は、ヘッダーを含め、リンクするヘッダーの間にライブラリを追加するだけで十分だと確信しています。(ADD)もちろん、プロトタイプでchar *
文字列を渡せないようにしたい場合、文字列をC ++文字列オブジェクトとして保持する場合はc_str()を使用する必要があります...