Скорее всего другой заголовок (или ваша реализация самого C) сделал что-то вроде:
#define BOOL unsigned char
, так что ваш компилятор видит:
typedef int unsigned char;
В порядке эксперимента, когда я компилирую код:
#define XYZZY unsigned char
typedef int BOOL;
int main (void) {
return 0;
}
, он работает нормально, но когда я изменяю эту первую строку на #define BOOL unsigned char
, я получаю точно такое же сообщение, которое вы видите:
qq.c:2:17: error: two or more data types in declaration specifiers
qq.c:2:5: warning: useless type name in empty declaration
Чтобы подтвердить это, вы можете скомпилировать только фазу препроцессора, чтобы увидеть, как этот код действительно выглядит на фазе компилятора.
Конечно, это зависит от компилятора, gcc -E
опция, которую вы бы использовали для gcc
.
Исправление это другой вопрос.Возможно, вам придется изменить один из типов псевдонимов на BOOL1
или что-то невероятно безобразное.Вероятно, это будет большее изменение, так как я предполагаю, что оно будет использовано совсем немного.
Вы можете быть в состоянии обойтись, просто убедившись, что обе подсистемы используют одно и то же определение BOOL
но все равно потребуется немало анализа, чтобы подтвердить, что это не будет иметь побочных эффектов.
Чтобы протестировать (и даже возможно реализовать) это исправление, вы можете изменить оператор #if
на что-то вроде:
#ifndef SKIP_BOOL_DEF
#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif
#endif
и затем скомпилируйте свой код с gcc -DSKIP_BOOL_DEF
(или эквивалентным), чтобы убедиться, что typedef
не выполнено.Затем он будет использовать ваше (надеюсь совместимое) определение системы.