Pergunta

Você pode definir uma macro que acessa uma variável normal, mas de uma maneira só de leitura (que não definindo-o como uma chamada para uma função)? Por exemplo, pode o macro VALOR no código a seguir ser definida de tal forma que a função doStuff () faz com que um erro de compilação?

struct myobj {
  int value;
}

/* This macro does not satisfy the read-only requirement */
#define VALUE(o) (o)->value

/* This macro uses a function, unfortunately */
int getvalue(struct myobj *o) { return o->value; }
#define VALUE(o) getvalue(o)

void dostuff(struct myobj *foo) {
   printf("The value of foo is %d.\n", VALUE(foo)); /* OK */
   VALUE(foo) = 1; /* We want a compile error here */
   foo->value = 1; /* This is ok. */
}
Foi útil?

Solução

Se a variável é sempre numérico, isso funciona:

#define VALUE(x) (x+0)

ou no contexto do seu exemplo,

#define VALUE(x) (x->value+0)

Outras dicas

Ok, eu vim com um:

#define VALUE(o) (1 ? (o)->value : 0)

Veja §6.5.17 no padrão C (C99 & C1X): “Um operador vírgula não produz uma Ivalue”

#define VALUE(x) (0, x)

(Não portátil para C ++.)

Tente

#define VALUE(o) (const int)((o)->value)

É este um quebra-cabeça ou é uma tarefa de engenharia? Se é uma tarefa de engenharia, então há melhores maneiras de obter opacidade das estruturas em C. Em este blog artigo , eu escrevi uma descrição bastante decente de como fazer isso em C.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top