Une macro peut-elle être utilisée pour un accès en lecture seule à une variable?

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

  •  02-07-2019
  •  | 
  •  

Question

Pouvez-vous définir une macro qui accède à une variable normale, mais en lecture seule (autre que la définir comme un appel à une fonction)? Par exemple, la macro VALUE du code suivant peut-elle être définie de telle sorte que la fonction dostuff () provoque une erreur de compilation?

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. */
}
Était-ce utile?

La solution

Si la variable est toujours numérique, cela fonctionne:

#define VALUE(x) (x+0)

ou dans le contexte de votre exemple,

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

Autres conseils

Ok, j'en ai trouvé un:

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

Voir § 6.517 dans la norme C (C99 & C1x): "Un opérateur de virgule ne produit pas de valeur lvalue."

#define VALUE(x) (0, x)

(Non portable en C ++.)

Essayez

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

S'agit-il d'un casse-tête ou s'agit-il d'une tâche d'ingénierie? S'il s'agit d'une tâche d'ingénierie, il existe de meilleurs moyens d'obtenir l'opacité des structures en C. Dans cet article de blog , j’ai écrit une description assez décente de la marche à suivre pour le faire en C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top