sybdb.h, вызывающий «два или более типов данных в спецификаторах объявления» - PullRequest
1 голос
/ 28 января 2012

Я компилирую программу на C, которая включает в себя sybdb.h, и получаю сообщение об ошибке «два или более типов данных в спецификаторах объявления» в строке typedef ниже (а sybdb.h - стандартный файл, а не мой) .

#if !defined(_WINDEF_) && !defined(_WINDEF_H) && !defined(DOS32X)
typedef int BOOL;
#endif

Похоже, что есть какой-то конфликт с другой библиотекой, которую я включаю, но я не знаю, что означает ошибка или как ее исправить. Помощь

1 Ответ

2 голосов
/ 28 января 2012

Скорее всего другой заголовок (или ваша реализация самого 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 не выполнено.Затем он будет использовать ваше (надеюсь совместимое) определение системы.

...