16

識別子と文字列の一致したリストを生成したいとします

enum
{
NAME_ONE,
NAME_TWO,
NAME_THREE
};

myFunction(NAME_ONE, "NAME_ONE");
myFunction(NAME_TWO, "NAME_TWO");
myFunction(NAME_THREE, "NAME_THREE");

..繰り返したり、コードを自動生成したりせずに、C /C++マクロを使用する

最初の推測:

を含む#includeファイルを追加できます

myDefine(NAME_ONE)
myDefine(NAME_TWO)
myDefine(NAME_THREE)

次に、次のように2回使用します。

#define myDefine(a) a,
enum {
#include "definitions"
}
#undef myDefine

#define myDefine(a) myFunc(a, "a");
#include "definitions"
#undef myDefine

しかし、#defineではパラメータを文字列内に入れることはできませんか?

4

2 に答える 2

26

2番目の#defineには、次のように#プリプロセッサ演算子を使用する必要があります。

#define myDefine(a) myFunc(a, #a);

これにより、引数が文字列に変換されます。

于 2008-09-24T09:55:18.203 に答える
3

名前リストを宣言する良い方法は次のとおりです。

#define FOR_ALL_FUNCTIONS(F)\
  F(NameOne)\
  F(NameTwo)\
  F(NameThree)\

#define DECLARE_FUNCTION(N)\
    void N();

#define IMPLEMENT_FUNCTION(N)\
    void N(){}

FOR_ALL_FUNCTIONS(DECLARE_FUNCTION);
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);

このようにして、この名前リストを複数回再利用できます。新しい言語機能のプロトタイピングに使用しましたが、最終的に使用することはありませんでした。したがって、少なくとも、それらは自分の発明の行き止まりを見つけるための優れた方法でした。彼らが言うことのせいなのだろうか:「マクロは悪い」... :)

于 2008-09-24T11:04:33.827 に答える