Макросы C++:манипулирование параметром (конкретный пример)

StackOverflow https://stackoverflow.com/questions/806543

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужно заменить

GET("any_name")

с

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");

Ключевые моменты:

  • Используйте ## для объединения параметров макроса в один токен (токен => имя переменной и т.д.)
  • И # для упорядочивания параметра макроса (очень полезно при выполнении "отражения" в C / C ++)
  • Используйте префикс для ваших макросов, поскольку все они находятся в одном и том же "пространстве имен", и вы не хотите столкновений с каким-либо другим кодом.(Я выбрал MLV, основываясь на вашем имени пользователя)
  • Макросы-оболочки помогают, если вы вкладываете макросы, т.е.вызовите MLV_GET из другого макроса с другими объединенными / строковыми параметрами (согласно комментарию ниже, спасибо!).

Другие советы

Один из подходов заключается в том, чтобы не заключать имя в кавычки при вызове макроса:

#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