У меня есть несколько заголовочных файлов с некоторыми простыми прославленными 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
макрос, который ничего не оценивает.
API_ABSTRACT нигде не определен (соответствующий файл не был включен). Способ проверить это через контрольный сигнал gcc -E
:
struct API_ABSTRACT overriden
С -E
, gcc будет показывать предварительно обработанный вывод, а наличие API_ABSTRACT в поле зрения означает, что препроцессор ничего об этом не знает.
Когда компилятор C ++ видел эту конструкцию (struct API_ABSTRACT overridden
), он подумал (в соответствии с грамматикой и, если вы даете представление составителям), что overriden
переменная типа API_ABSTRACT
, После фигурных скобок конструкция превратилась в инициализацию указанной переменной. Однако тип API_ABSTRACT никогда не определялся, поэтому компилятор жаловался на инициализацию переменной неполного типа.
Других решений пока нет …