C ++ macros: manipulação de um parâmetro (exemplo específico)
-
03-07-2019 - |
Pergunta
Eu preciso substituir
GET("any_name")
com
String str_any_name = getFunction("any_name");
A parte mais difícil é como cortar fora as aspas. Possível? Alguma idéia?
Solução
Como sobre: ??
#define UNSAFE_GET(X) String str_##X = getFunction(#X);
Ou, para segurança contra questões macro aninhados:
#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));
Uso:
SAFE_GET(foo)
E é isso que é compilado:
String str_foo = getFunction("foo");
Pontos principais:
- Use ## para combinar parâmetros macro em um único token (sinal => nome da variável, etc)
- E # para stringify um parâmetro macro (muito útil quando se faz "reflexão" em C / C ++)
- Use um prefixo para as macros, uma vez que são todos no mesmo "namespace" e você não quer colisões com qualquer outro código. (Eu escolhi MLV com base no seu nome de usuário)
- O macros de mensagens publicitárias ajudar se você ninho macros, ou seja, chamar MLV_GET de outra macro com outro fundiu / parâmetros Stringized (de acordo com o comentário abaixo, graças!).
Outras dicas
Uma abordagem é para não citar o nome quando você chamar a macro:
#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 );
}
Em resposta à sua pergunta, não, você não pode "retirar" as citações em C ++. Mas, como outras respostas demonstram, você pode "adicioná-las." Desde que você vai sempre estar trabalhando com uma string literal de qualquer maneira (certo?), Você deve ser capaz de mudar para o novo método.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow