ANSI C にはなぜ名前空間がないのでしょうか? 質問する

ANSI C にはなぜ名前空間がないのでしょうか? 質問する

ほとんどの言語では、名前空間を持つことは当然のことのように思えます。しかし、私が知る限り、ANSI C はそれをサポートしていません。なぜでしょうか? 将来の標準にそれを含める予定はありますか?

ベストアンサー1

完全を期すために、C では、名前空間から得られる「利点」を実現する方法がいくつかあります。

私のお気に入りの方法の 1 つは、ライブラリなどへのインターフェースとなる一連のメソッド ポインターを格納するための構造体を使用することです。

次に、この構造体の extern インスタンスを使用して、すべての関数を指すライブラリ内で初期化します。これにより、クライアントの名前空間を踏むことなく、ライブラリ内の名前をシンプルに保つことができます (グローバル スコープの extern 変数以外、1 つの変数と数百のメソッドなど)。

追加のメンテナンスも多少必要になりますが、最小限であると思います。

次に例を示します。

/* interface.h */

struct library {
    const int some_value;
    void (*method1)(void);
    void (*method2)(int);
    /* ... */
};

extern const struct library Library;
/* end interface.h */

/* interface.c */
#include "interface.h"

void method1(void)
{
   ...
}
void method2(int arg)
{
   ...
}

const struct library Library = {
    .method1 = method1,
    .method2 = method2,
    .some_value = 36
};
/* end interface.c */

/* client code */
#include "interface.h"

int main(void)
{
    Library.method1();
    Library.method2(5);
    printf("%d\n", Library.some_value);
    return 0;
}
/* end client code */

構文を使用すると.、従来のLibrary_function(),Library_some_valueメソッドとの強い関連性が生まれます。ただし、マクロを関数として使用できないなど、いくつかの制限があります。

おすすめ記事