Перечислим разные компиляторы - PullRequest
1 голос
/ 13 мая 2009

Я создаю приложение, которое должно компилироваться как в Windows, так и в Linux. Приложение написано на C, почти все работает, за исключением того, что компилятор MinGW отказывается от этого

typedef struct somestruct{
   ...snip...
   enum {NODE, REAL} type;
};

somestruct* something;
switch (something->type){
 case NODE:
   ...stuff...;
   break;
 case REAL:
   ...otherstuff...;
   break;
}

В нем говорится, что НОД и РЕАЛ не определены, Но если я предоставлю разрешение области действия

case somestruct::NODE

Это компилируется с MinGW 3.4.1, но не компилируется с gcc 4.1.2 в linux. Это просто проблема компилятора, которую нужно решить с помощью препроцессоров, или есть какое-то другое объяснение?

Ответы [ 2 ]

6 голосов
/ 14 мая 2009

Приложение написано на "C", но компилятор требует, чтобы вы сделали somestruct::NODE, что является допустимым "C ++", но не допустимым "C".

Вывод: вы компилируете этот код с MinGW в режиме C ++, но со всеми другими компиляторами в режиме C.

Возможная причина: MinGW может не обрабатывать foo.C и foo.c одинаково, а ваши файлы имеют имена с заглавным буквой C (что подразумевает C ++ в UNIX).

Решение: добавьте флаг -xc в MinGW, чтобы принудительно компилировать plain-C.

3 голосов
/ 13 мая 2009

Если вы избавитесь от вложенности, она должна работать переносимо:

typedef enum somestruct_type {
    somestruct_type_NODE, somestruct_type_REAL
} somestruct_type;
typedef struct somestruct {
   ...snip...
   somestruct_type type;
} somestruct;

Я видел очень похожий код, портированный на большое количество компиляторов C и C ++.

(я не говорю, что это единственный способ сделать это; я просто говорю, что этот способ работает).

...