Ho una struttura che potrebbe avere altri 2 membri a seconda della variabile del preprocessore.
struct foo {
int m1;
// ... (other members)
#ifdef MORE_MEMBERS
int m2;
int m3;
#endif
}
In alcune parti del codice, ho bisogno di cambiare alcune chiamate di funzione da func(foo.m1)
a func(foo.m1, foo.m2, foo.m3)
. Gli ultimi due argomenti saranno ignorati se MORE_MEMBERS
non è definito, ma ricevo comunque errori di compilazione dalle chiamate di funzione.
Posso pensare a due soluzioni:
(1) Usa un'unione. m2
e m3
saranno solo alias su m1
.
struct foo {
#ifdef MORE_MEMBERS
int m1, m2, m3;
#else
union {
int m1, m2, m3;
}
#endif
// ... (other members)
}
(2) Usa una funzione wrapper, mantenendo la definizione della struttura senza unione.
func2(foo) {
#ifdef MORE_MEMBERS
func(foo.m1, foo.m2, foo.m3);
#else
func(foo.m1);
#endif
}
Cosa sarebbe meglio nel file con le chiamate alle funzioni modificate? Una modifica di func(int)
in func(int,int,int)
o func(int)
in func2(foo)
.