Newsgroup: it.comp.lang.c
Titolo: Evitare il warning Duplicate symbol definition

In un file .h ho definito una complessa struttura:
typedef struct {
  struct S1 s1;
  struct S2 s2;
  struct S3 s3;
  ...
  struct Sn sn;
} S;
Siccome è importante per me che tutti i campi abbiano sempre il
medesimo offset nella struttura principale S e siccome potrebbe
sfuggirmi andando a modificare le definizioni delle singole Sx, avevo
pensato di fare questo:
char s1_test[offsetof(s1,S) == 0];
char s2_test[offsetof(s2,S) == 4];
...
char s2_test[offsetof(sn,S) == 1030];
Se il compilatore mi dà errore di array con dimensione zero, vuol dire
che gli offset sono stati cambiati. Naturalmente questo ha la
controindicazione di allocare inutilmente n array di char da 1
dimensione (quindi
n byte), ma è una cosa che posso tranquillamente accettare perchè mi
fa stare sicuro che, se dovessi cambiare gli offset, me ne accorgerei
subito.
Il problema è che sia la typedef che la definizione degli array di
test sono inseriti in un .h e il compilatore, giustamente, mi dà
errore di duplicate symbol definition per gli array di test. Come
potrei evitare questo warning senza spostare la definizione degli
array in un .c? Mi piacerebbe che la definizione degli array sia
subito sotto il typedef della struttura S.

 subito sotto il typedef della struttura S.
generalmente questo tipo di problemi si risolve definendo una costante
per il preprocessore:
mettiamo che il file si chiami struttura_fenomenale.h
#ifndef STRUTT_FENOM
#define STRUTT_FENOM
qui tutto il contentuto del file h
#endif
quando viene riletto la seconda volta e' stata gia' definita
STRUTT_FENOM e il contenuto del file viene saltato
spero sia d'aiuto

 spero sia d'aiuto
Nah, questo non risolve affatto. Se compili separatamente più files .c
che includono quel .h avrai un errore sul linker.
L'unica soluzione è qualche magia di preprocessore, magari uno
scriptino m4. Personalmente non perderei tempo e metterei tutto in un
bel check_array.c (anche perché infilare chili di preprocessore
ridurrebbe la leggibilità del codice, che è quella che l'OP vorrebbe
invece aumentare, da quanto ho capito).
Ciao!

 dimensione
Usa dei typedef. Cos� risolvi sia il problema dell'allocazione inutile, sia
quello della duplicazione dei simboli. Con un'opportuna macro, puoi rendere
anche pi� leggibile il codice:
 #define STATIC_CHECK_OFFSET(Struct,Member,Value) \
                typedef char STATIC_CHECK_OFFSET_##Struct##_##Member \
                [ 2*(offsetof(Struct,Member) == Value )-1 ];
 STATIC_CHECK_OFFSET( S, s1, 0 )
 STATIC_CHECK_OFFSET( S, s2, 4 )
(Ho usato "2*(...)-1", perch� in questo modo che si ottiene l'effetto voluto
anche se il compilatore accetta dichiarazioni di array con dimesione zero,
come fa GCC senza "-pedantic".)
Max

 Max
grande, bella soluzione - a questa non avevo pensato :)

 subito sotto il typedef della struttura S.
Mi pare che se metti extern davanti alle definizioni risolvi questo 
problema e anche l'altro (la memoria non viene allocata). Ma non ho provato.
E.

 come fa GCC senza "-pedantic".)
Eccezionale... grazie :)

 che includono quel .h avrai un errore sul linker.
Avevo capito che stava sviluppando un solo programma e che quindi la
compilazione avveniva una sola volta con tutti i files c.
Sorry.