8

エンジニアリング仕様書の要​​素と同じ名前の変数がたくさんあるので、文字列バージョンの名前も役に立ちます。

私は次のようなマクロをよく使用しています。

#define MACRO(a) a, #a

一般的な使用法は次のとおりです。

void someFunction(int a, const char *name);

someFunction(MACRO(meaningfully_named_variable));

私の質問は 3 つあります。

  • これを行うより良い方法はありますか?
  • Boost または他のライブラリで同様のマクロを利用できますか?
  • そうでない場合、どうすればこれを改良して名前を変更し、明確で有用なものにすることができますか?

編集 上記は最小限の例であると言うべきでした。関数には他のパラメーターが含まれる場合があり、名前付きエンティティはデータ メンバーである場合もあれば、関数自体である場合もあります。

私が C++ 用に検討しているもう 1 つの拡張機能はNamedRef、マクロの内容を受け取ることができるクラスです。

template <typename T>
struct NamedRef
{
    NamedRef(T *t, const char *name) : t(t), name(name) { }
    T *t;
    const char *name;
};

template <typename T>
NamedRef<T> namedRef(T &t, const char *name)
{
    return NamedRef<T>(&t, name);
}

#define WITH_NAME(a) a, #a

// more sophisticated usage example
void otherFunction(double, NamedRef<int>, bool);

otherFunction(0.0, namedRef(object.WITH_NAME(meaningful_member_name)), false);
4

4 に答える 4

5

さらに一歩進めることができます:

#define SOMEFUNCTION(a) somefunction(a, #a)

ただし、これは同じ関数を何度も呼び出す場合にのみ役立ちます。そうでなければ、あなたの例よりも良い方法はないと思います。もちろん、マクロの名前をより意味のあるものに変更する必要がありますARGUMENTS

于 2011-12-21T23:33:24.170 に答える
0

ジェシーが答えたように、

次のように書くことができます:

void function1(int a, const char* name)
{
    cout << "a: " << a << endl;
    cout << "name: " << name << endl;
}

void function2(double d, const char* name, const char *str)
{
    cout << "d: " << d << endl;
    cout << "name: " << name << endl;
    cout << "str: " << str << endl;
}

#define MACRO(functionName, a) functionName(a, #a)
#define MACRO2(functionName, a, ...) functionName(a, #a, __VA_ARGS__)

int main()
{
    int a = 10;
    MACRO(function1, a);
    double d = 10.5;
    MACRO2(function2, d, "Hello world");
    return 0;
}

渡す引数がさらにある場合は、可変引数を使用する MACRO2 を使用できます。それに応じて関数名を渡す必要があります。

于 2011-12-22T09:18:28.977 に答える
0
#define someFunction(a)  if (1) stringized_someFunction((a), #a ); else (void)0
void stringized_someFunction(int a, const char* name);

if (1) はマクロをラップして、(通常は) ループ、分岐、if ステートメントなどで混乱しないようにします。

次に、関数を次のように呼び出します。

int r = 4;
someFunction(r);

実際には、「関数宣言」ごとに 1 行追加するだけです。C プリプロセッサで複数のステップが許可されている場合は、すべてを 1 つにまとめることができますが、残念ながらそうではありません。

関数を記述する必要があることが明らかであることを願っているため、忘れていました。

void stringized_someFunction(int a, const char* name)
{
  // Do stuff here
}

とにかく、そのように読む方がはるかに簡単できれいなはずです.

于 2011-12-22T00:06:56.147 に答える
0

XMACROがこの種の作業に役立つことがわかるでしょう。

于 2011-12-22T00:12:02.463 に答える