質問

交換する必要があります

GET("any_name")

with

String str_any_name = getFunction("any_name");

難しいのは、引用符を切り取る方法です。可能?アイデアはありますか?

役に立ちましたか?

解決

方法:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

または、ネストされたマクロの問題から保護するために:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

使用法:

SAFE_GET(foo)

そして、これはコンパイルされたものです:

String str_foo = getFunction("foo");

キーポイント:

  • ##を使用して、マクロパラメータを1つのトークンに結合します(トークン= "gt;変数名など)
  • マクロパラメータを文字列化する#
  • マクロはすべて同じ「ネームスペース」にあるため、プレフィックスを使用します。また、他のコードとの衝突は望ましくありません。 (ユーザー名に基づいてMLVを選択しました)
  • ラッパーマクロは、マクロをネストする場合、つまり、他のマージ/文字列化されたパラメーターを使用して別のマクロからMLV_GETを呼び出す場合に役立ちます(以下のコメントに従って、ありがとう!)

他のヒント

1つのアプローチは、マクロを呼び出すときに名前を引用しないことです:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

int main() {
    GET( foobar );
}

質問への回答では、いいえ、「ストリップ」することはできません。 C ++の引用符。しかし、他の回答が示すように、「追加」することができます。とにかく文字列リテラルを常に使用するので(右?)、新しいメソッドに切り替えることができるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top