5

次のようにCで名前空間を模倣することができます。

#include <stdio.h>
#include <math.h>

struct math_namespace {
    double (*sin)(double);
};
const struct math_namespace math = {sin};

int main() {    
    printf("%f\n", math.sin(3));

    return 0;
}

これには不利な点がありますか、それともプレフィックスの方が理にかなっている状況ですか?この方法でそれを行う方がきれいに思えます。

4

4 に答える 4

3

この方法は、 JacobNaviaによるCContainersLibraryなどの実際のプロジェクトですでに使用されています。Cはオブジェクト指向プログラミング用に設計されていません。(1)構造体にアクセスし、(2)関数ポインタを逆参照する必要があるため、これは実際には効率的ではありません。本当にプレフィックスが必要な場合は、識別子を変更することが最善の解決策であると思います。

于 2013-02-26T17:12:34.600 に答える
1

私はしばらくこのスタイルを使用しています。これは、OOP言語の余分な手荷物をすべて使わずにプログラムを編成するのに役立ちます。Cで関数ポインタにアクセスすることは、関数に直接アクセスすることと同じであるため、パフォーマンスの低下はありません。私はそれについて非常に短い論文を書いたほどそれが好きです。これは、http: //slkpg.1eko.comのページ下部にある「CwithStructs」リンクの下にあります。直接リンクはhttp://slkpg.1eko.com/cstructs.htmlです。

于 2014-11-01T20:05:53.997 に答える
0

なぜ車輪の再発明をするのですか?欠点の1つは、すべての設定が同期しなくなる可能性があることです。また、名前空間に追加するには、構造を変更する必要があります。

また、「名前空間の使用」はないため、常に指定する必要があります。さまざまなパラメータタイプの関数についてはどうですか?

于 2013-02-26T17:04:54.397 に答える
0

これにより、名前空間をエクスポートでき、クライアントモジュールで。という名前の静的バージョンまたはローカルバージョンを使用できるようになりますsin。したがって、その意味では、実際に機能します。

欠点は、それがひどくELFに優しいわけではないということです。構造体の初期化は書き込み可能なデータページの途中に埋め込まれているため、パッチを適用する必要があります。静的にリンクしている場合を除き、これはロード時の修正です。明るい面では、ELFディスパッチテーブルが実行したことを複製するだけなので、遅くなることはないと思います。Windowsでも、考慮事項は似ていると思います。

于 2013-02-26T17:11:17.080 に答える