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?

Foi útil?

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
scroll top