これは、Cのジェネリックライブラリについて尋ねる現在の質問に対する答えによって促されます。質問者は、C ++を使用したくないと具体的に述べています。
Cは完全なプログラミング言語です。CはC ++の任意のサブセットではありません。CはC ++のサブセットではありません。
これは有効なC:
foo_t* foo = malloc ( sizeof(foo_t) );
C ++としてコンパイルするには、次のように記述する必要があります。
foo_t* foo = static_cast<foo_t*>( malloc ( sizeof(foo_t) ) );
これはもはや有効なCではありません。(Cスタイルのキャストを使用できます。この場合、Cでコンパイルされますが、ほとんどのC ++コーディング標準によって、そして多くのCプログラマーによって避けられます。スタックオーバーフロー全体で「mallocをキャストしない」コメントを確認してください) 。
これらは同じ言語ではありません。Cに既存のプロジェクトがある場合、ライブラリを使用するためだけに別の言語で書き直したくありません。作業している言語でインターフェースできるライブラリーを使用することをお勧めしますextern "C"
。
私が取り組んでいるプロジェクトの最初のCファイルを取得すると、次のようにスワップgcc std=c99
しただけですg++
:
sandiego:$ g++ -g -O1 -pedantic -mfpmath=sse -DUSE_SSE2 -DUSE_XMM3 -I src/core -L /usr/lib -DARCH=elf64 -D_BSD_SOURCE -DPOSIX -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112L -Wall -Wextra -Wwrite-strings -Wredundant-decls -Werror -Isrc src/core/kin_object.c -c -o obj/kin_object.o | wc -l
In file included from src/core/kin_object.c:22:
src/core/kin_object.h:791:28: error: anonymous variadic macros were introduced in C99
In file included from src/core/kin_object.c:26:
src/core/kin_log.h:42:42: error: anonymous variadic macros were introduced in C99
src/core/kin_log.h:94:29: error: anonymous variadic macros were introduced in C99
...
cc1plus: warnings being treated as errors
src/core/kin_object.c:101: error: ISO C++ does not support the ‘z’ printf length modifier
..
src/core/kin_object.c:160: error: invalid conversion from ‘void*’ to ‘kin_object_t*’
..
src/core/kin_object.c:227: error: unused parameter ‘restrict’
..
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
src/core/kin_object.c:271: error: ISO C++ does not support the ‘z’ printf length modifier
合計69行のエラーがあり、そのうち4行は無効な変換ですが、ほとんどがC99には存在するがC ++には存在しない機能に関するものです。
それは私がそれを楽しむためにそれらの機能を使用しているようではありません。それを別の言語に移植するにはかなりの作業が必要になります。
したがって、それを示唆するのは明らかに間違っています
[a] Cコンパイラはほぼ確実に実際にはC ++コンパイラであるため、ソフトウェアのコストへの影響はありません
多くの場合、既存のCコードをC ++の手続き型サブセットに移植すると、コストに大きな影響があります。
したがって、Cでキューのライブラリ実装を探すための質問への回答として「C ++ std :: queueクラスを使用する」ことを提案することは 、「目的Cを使用する」および「JNIを使用してJava java.util.Queueクラスを呼び出す」ことを提案するよりも後回しです。または'CPythonライブラリを呼び出す' -Objective Cは実際にはC(C99を含む)の適切なスーパーセットであり、JavaおよびCPythonライブラリはどちらもCから直接呼び出すことができ、無関係なコードをC ++言語に移植する必要はありません。
もちろん、CファサードをC ++ライブラリに提供することもできますが、一度実行すると、C ++はJavaやPythonと変わりません。