Poiché non esiste una caratteristica linguistica in C per proteggere l'assegnazione alle variabili globali, consiglieresti di fare qualcosa del genere?
Prendi questo esempio:
We have a module with the header file called
module.h
and implementation filemodule.c
. The module contains a global variable calledglobal_variable
.global_variable
will be updated by other functions in the implementation but we do not want users ofmodule
to be able to assign to it.
module.h:
#ifndef MODULE_H_
#define MODULE_H_
extern int global_variable;
#define global_variable (int)global_variable
/* Because the macro expansion is not an "lvalue" it cannot be assigned to. */
/* ... */
#endif
Nell'implementazione hai appena #undef
della macro per avere accesso completo in lettura / scrittura ad esso.
module.c:
#include "module.h"
#undef global_variable /* Make 'global_variable' mutable again. */
int global_variable = 17;
/* ... */
Questo metodo ha ovviamente lo svantaggio di non poter creare una variabile locale con l'identificatore global_variable
senza #undef
ing della macro.
#include "module.h"
int f(void)
{
int global_variable; /* This doesn't work. */
/* ... */
}
Ma se riesci a trovare una convenzione di denominazione che separi gli identificatori, questo non sarà un problema. Qualcosa come il prefisso delle variabili globali con glbl_
o GLBL_
. GLBL_
sembra una buona scelta dato che ti dà anche un suggerimento che può essere definita come una macro.
Un'altra tecnica che ho capito è questa:
module.h:
#ifndef MODULE_H_
#define MODULE_H_
#ifdef MODULE_IMPL_
extern int global_variable; /* Writable for the implementation. */
#else
extern const int global_variable; /* 'readonly' for everyone else. */
#endif
/* ... */
#endif
module.c:
#define MODULE_IMPL_ /* I am the implementation. I want global_variable to be mutable. */
#include "module.h"
int global_variable = 17;
/* ... */
So che l'approccio più semplice e flessibile è quello di creare funzioni get
per recuperare il valore della variabile al costo di una chiamata di funzione. Ma questo non mi impedisce di trovare altri hack per risolvere il problema.
Queste cose cattive sono da fare? Non ho intenzione di mentire, mi piace giocare con i macro. Ma voglio sapere se questo è qualcosa che può essere applicato a un progetto serio. :)