ほとんどの言語では、名前空間を持つことは当然のことのように思えます。しかし、私が知る限り、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
メソッドとの強い関連性が生まれます。ただし、マクロを関数として使用できないなど、いくつかの制限があります。