2009-05-13 4 views
1

Je construis une application qui doit être compilée sous Windows et Linux. L'application est écrit en C, presque tout fonctionne, sauf le compilateur MinGW refuse ceCumum différents compilateurs

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 compile 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 des préprocesseurs ou existe-t-il d'autres explications?

+1

Pouvez-vous confirmer que vous posez des questions sur C et non sur C++? –

+0

C'est définitivement C, "quelque chose" est un pointeur. – Mitch

+4

C n'a pas de portée de structure comme vous l'utilisez dans somestruct :: NODE. vous devez parler d'une autre langue –

Répondre

3

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 le code très semblable à celui d'être porté à 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 ça fonctionne).

6

L'application est écrite en "C", mais le compilateur exige que vous faites somestruct::NODE, ce qui est 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 foo.C et foo.c le même, et vos fichiers sont nommés avec un suffixe C majuscule (ce qui implique C++ sous UNIX).

Solution: ajoutez le flag -xc à MinGW pour forcer les compilations C simples.

Questions connexes