C enum différents compilateurs
Question
Je construis une application qui a besoin de compiler sur Windows et Linux. L'application est écrit en C, presque tout fonctionne, sauf le compilateur MinGW refuse cette
typedef struct somestruct{
...snip...
enum {NODE, REAL} type;
};
somestruct* something;
switch (something->type){
case NODE:
...stuff...;
break;
case REAL:
...otherstuff...;
break;
}
Il dit NODE et REAL ne sont pas définis, Mais si je fournir une résolution de portée
case somestruct::NODE
Cette compilation avec MinGW 3.4.1, mais ne parvient pas à compiler avec gcc 4.1.2 sur Linux. Est-ce simplement un problème de compilateur qui doit être résolu avec préprocesseurs ou est-il une autre explication?
La solution
Si vous vous débarrasser de l'imbrication, il devrait fonctionner portably:
typedef enum somestruct_type {
somestruct_type_NODE, somestruct_type_REAL
} somestruct_type;
typedef struct somestruct {
...snip...
somestruct_type type;
} somestruct;
J'ai vu un code très similaire à ce être porté sur un grand nombre de compilateurs C et C.
(je ne dis pas que c'est la seule façon de le faire, je dis simplement que cette façon fonctionne).
Autres conseils
L'application est écrit dans « C », mais les exigences du compilateur que vous faites, ce qui est somestruct::NODE
valide « C ++ », mais pas valide « C ».
. Conclusion: vous compilez ce code avec MinGW en mode C ++, mais avec tous les autres compilateurs en mode C
Cause probable:. MinGW ne peut pas traiter et foo.C
même foo.c
et vos fichiers sont nommés avec un suffixe capital C (ce qui implique C ++ sous UNIX)
Solution: ajoutez drapeau MinGW -xc
pour forcer plaine-C compiles