C ++マクロ:パラメーターの操作(特定の例)
-
03-07-2019 - |
質問
交換する必要があります
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 ++の引用符。しかし、他の回答が示すように、「追加」することができます。とにかく文字列リテラルを常に使用するので(右?)、新しいメソッドに切り替えることができるはずです。
所属していません StackOverflow