これを行うためのより良い非マクロの方法があることを無視して(悲しいことに、私には正当な理由があります)、マクロを使用して大量のジェネリックコードを書く必要があります。基本的に、いくつかの事前に指定されたタイプに対して多数の関数を生成するマクロライブラリ。
多数の既存の単体テストを壊さないようにするために、ライブラリが実行する必要があることの1つは、すべてのタイプについて、印刷用にすべての大文字でそのタイプの名前を生成することです。たとえば、タイプ「フラグ」は「FLAG」として印刷する必要があります。
タイプごとに定数を手動で書き出すことができます。
#define flag_ALLCAPSNAME FLAG
しかし、これは理想的ではありません。これをプログラムで実行できるようにしたいと思います。
現在、私はこれを一緒にハックしました:
char capname_buf[BUFSIZ];
#define __MACRO_TO_UPPERCASE(arg) strcpy(capname_buf, arg); \
for(char *c=capname_buf;*c;c++)*c = (*c >= 'a' && *c <= 'z')? *c - 'a' + 'A': *c;
__MACRO_TO_UPPERCASE(#flag)
これは私がある程度やりたいことをします(つまり、このコードの後に、capname_bufはその内容として「FLAG」を持ちます)が、代わりにマクロを使用して文字列リテラルを定義できるソリューションを好みます。これは必要ありません。愚かなバッファ。
これを行う方法がわかりませんが、おそらく何か明らかなものが欠けていますか?
可変個引数のforeachループマクロを(このように)記述していますが、#flagによって生成された文字列リテラルの内容を変更することはできません。いずれの場合も、ループマクロを反復処理するには文字ポインターのリストが必要です(つまり、インデックスなどではなく、リストを繰り返し処理します)。
考え?