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

interface typedef является частью унаследованного кода, который я не могу контролировать, и 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?

Спасибо.



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

struct API_ABSTRACT overriden

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

0

Решение

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

struct API_ABSTRACT overriden

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]