È possibile utilizzare una macro per l'accesso in sola lettura a una variabile?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Puoi definire una macro che accede a una variabile normale, ma in modo di sola lettura (oltre a definirla come una chiamata a una funzione)? Ad esempio, la macro VALUE nel codice seguente può essere definita in modo tale che la funzione dostuff () causi un errore di compilazione?

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. */
}
È stato utile?

Soluzione

Se la variabile è sempre numerica, funziona:

#define VALUE(x) (x+0)

o nel contesto del tuo esempio,

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

Altri suggerimenti

Ok, ne ho trovato uno:

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

Vedi §6.5.17 nello standard C (C99 & amp; C1x): "Un operatore virgola non restituisce un valore."

#define VALUE(x) (0, x)

(Non portabile in C ++.)

Prova

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

È un enigma o è un compito di ingegneria? Se si tratta di un'attività di ingegneria, allora ci sono modi migliori per ottenere l'opacità delle strutture in C. In questo articolo del blog , ho scritto una descrizione abbastanza decente di come farlo in C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top