GCC - ошибка "имеет инициализатор, но неполный тип" при использовании макросов для атрибутов функции

У меня есть несколько заголовочных файлов с некоторыми простыми прославленными structс просто чистыми виртуальными методами, определенными в них. Код прекрасно компилируется в Windows с Visual Studio 2015, но GCC застревает. Сначала код:

Листинг кода


namespace CustomUtils
{
    interface API_ABSTRACT overriden
    {
        virtual int GetStatus() const = 0;
    };
}

В импортированном заголовочном файле interface просто определяется как stuct:

#define interface struct

А также API_ABSTRACT это просто макрос для ничего:

#define API_ABSTRACT

interfacetypedef является частью унаследованного кода, который я не могу контролировать, и API_ABSTRACT так что я могу определить пользовательские атрибуты в Windows и Linux, чтобы ограничить, какие функции API я экспортирую. Хотя это собирается в VS2015, в Linux я получаю ошибку сборки:


error: variable 'API_ABSTRACT CustomUtils::overridden' has initializer but incomplete type

Если я изменю строку:

interface API_ABSTRACT overriden

То, что я предполагаю, переводится на:

struct overriden

Код прекрасно скомпилируется в Linux. Я пытался скомпилировать с gcc -E -dD чтобы пост-"предварительно обработанный" источник отображался на экране, чтобы увидеть typedef а также #define замены, но, кажется, показывает только вывод для .cpp файлы, а не заголовок (.h) файлы.

Вопрос

Почему этот код не работает при попытке компиляции с GCC?

Спасибо.


Правка № 1


Выход из gcc -E показывает оскорбительную строку:

struct API_ABSTRACT overriden

Так что, кажется, виновником является API_ABSTRACT макрос, который ничего не оценивает.

1 ответ

Решение

API_ABSTRACT нигде не определен (соответствующий файл не был включен). Способ проверить это через контрольный сигнал gcc -E:

struct API_ABSTRACT overriden

С -E, gcc будет показывать предварительно обработанный вывод, а наличие API_ABSTRACT в поле зрения означает, что препроцессор ничего об этом не знает.

Когда компилятор C++ видел эту конструкцию (struct API_ABSTRACT overridden), он подумал (в соответствии с грамматикой и, если вы даете представление составителям), что overriden переменная типа API_ABSTRACT, После фигурных скобок конструкция превратилась в инициализацию указанной переменной. Однако тип API_ABSTRACT никогда не определялся, поэтому компилятор жаловался на инициализацию переменной неполного типа.

Другие вопросы по тегам