これを行うにはマクロ以外の方法が良いことがあることを無視しています(悲しいことに、良い理由があります)、マクロを使用して大量の汎用コードを書く必要があります。基本的には、いくつかの事前指定された型に対して多数の関数を生成するマクロライブラリです。プリプロセッサ(マクロ)を使用してC文字列リテラルを大文字に変換できますか?
既存の単体テストが数多く破壊されないようにするために、ライブラリで必要なことの1つは、すべての型に対して、その型の名前をすべて大文字で生成して印刷することです。例えば。タイプ "フラグ"は "フラグ"として印刷されなければならない。
各タイプの定数を手動で書き出すことができます。
の#define flag_ALLCAPSNAME FLAG
が、これは理想的ではありません。私はこれをプログラム的に行うことができるようにしたいと思います。
現時点では、私は一緒にこれをハッキングしました:(このコードのビットの後、capname_bufは、その内容として「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)
が、私は希望代わりにマクロを使用して文字リテラルを定義することができ、この愚かなバッファの必要性を避けるソリューションを好む。
私はこれを行う方法がわかりませんが、おそらく私は何か明白なものを見逃していますか?
可変ループforeachループマクロ(this oneなど)が書かれていますが、#flagによって生成された文字列リテラルの内容を変更することはできません。また、いずれの場合でもループマクロには、繰り返し処理を繰り返します(つまり、リスト上で繰り返され、インデックス上で繰り返されることはありません)。
思考?
[cantはプリプロセッサディレクティブで小文字を大文字に変換できません](http://stackoverflow.com/questions/3216049/cant-convert-lowercase-to-uppercase-a-string-by-preprocessor-directive ) – unwind
@unwind私はそれを見ましたが、答えが正しくない(したがって役に立たない)b/cは、プリプロセッサでループを作ることができないと想定しています。 –
どのようにですか?あなたの例では、プリプロセッサで実行されたループは表示されません。また、それを行う方法が分かっていれば、開始点の一部ではないはずですか? – unwind