9

C++ では、テンプレートを使用して、ジェネリック コンテナーとタイプ セーフ コンテナーの両方を使用できます。ただし、C では、ジェネリック コンテナーが必要な場合は、(afaik) を使用void*する必要があります。つまり、タイプ セーフが失われます。タイプ セーフなコンテナを使用するには、保持するデータのタイプごとにコンテナを再実装する必要があります。

C が C++ よりもプログラマーが何をしているかを知っているという哲学に従っていることを考えると、Cで行うより慣用的なことは何でしょうvoid*か。

4

4 に答える 4

3

私は一般的なコンテナを目指しています:

  1. void *慣れてくると、タイプを気にしないのに、タイプを意味していると考えるだけです。それObjectは Java のようなものです -- Java では、長い間、ジェネリック コンテナーにも型の安全性がありませんでした。

  2. 改善できる場所は 1 つだけです。

  3. タイプ セーフは得られません。ただし、タイプ セーフなコンテナーを繰り返し実装すると、コピー アンド ペースト エラーが発生するリスクがあります。それもエラーにつながる可能性があります。

于 2012-04-29T06:19:21.087 に答える
1

そこで、Cコンテナの分野で新しい賢いアイデアが生まれたかどうかをすばやく検索しました。

私はこれを見つけまし。これは、完全なCコンテナライブラリでのかなり徹底的な試みです。

void *ポインタに含まれる要素を渡します。特定のタイプの構造を指定する試みはありません。

型の安全性のために、コンテナごとに「ラッパー」マクロを作成できます。これは、型指定されていないバージョンをラップし、型の安全性を提供するインライン関数の場合にホストを定義します。コンパイラによって最適化されることを願っていますが、これが常に可能であるとは限りません。そして、マクロは醜いでしょう。

これが、より多くの(アプリケーション)プログラムがCではなくC++で記述されている理由の1つだと思います。Cで複雑な抽象化を作成する機能は制限されています。あなたはそれを行うことができますが、あなたは一般的にパフォーマンスや保守性のような他の側面を犠牲にします(例えばCGTKプログラムをチェックしてください)。

于 2012-04-29T05:58:22.677 に答える
0

C でジェネリック データを処理する型を作成するには、 a を使用しvoid*てデータを渡します。考えられるタイプごとに新しいアルゴリズムを定義するのは現実的ではありません。

于 2012-04-29T05:39:09.253 に答える
0

メンバーとして使用しても実際の利点はありませんvoid*(たとえば、コンパイル時間が最も重要な場合を除きます)。いつでもvoid*適切な場所にキャストし、必要に応じて型指定されていないデータ BLOB を操作できます。

私はそのようなインターフェースをCで実装しました(たとえば、異なるタイプの名前付きフィールドを持つ複数のバリアント)。私は型安全性を持つことを好みvoid*、これらの実装で良いものにキャストすることはめったにありませんでした。

…またしても、私は c よりも c++ を書くことに多くの時間を費やしています :)

于 2012-04-29T05:53:57.463 に答える