GCC - "has initializer but incomplete type" 将宏用于函数属性时出错

GCC - "has initializer but incomplete type" error when using macros for function attributes

我有一些 header 文件,其中包含一些简单的美化 struct,其中只定义了纯虚拟方法。代码在 Windows 和 Visual Studio 2015 上编译良好,但 GCC 卡住了。一、代码:

代码清单


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

在导入的 header 文件中,interface 被定义为 stuct:

#define interface struct

API_ABSTRACT只是一个无用的宏:

#define API_ABSTRACT

interface typedef 是我无法控制的继承代码的一部分,并且 API_ABSTRACT 已经到位,因此我可以 define custom attributes 在 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 进行编译,以便将 post-"pre-processed" 源呈现到屏幕上以查看 typedef#define 替换,但似乎仅显示 .cpp 个文件的输出,而不显示 header (.h) 个文件的输出。

问题

为什么在尝试使用 GCC 编译时此代码无法运行?

谢谢。


编辑#1


gcc -E 的输出显示有问题的行是:

struct API_ABSTRACT overriden

所以罪魁祸首似乎是 API_ABSTRACT 宏,它的计算结果为空。

API_ABSTRACT 未在任何地方定义(未包含相应的文件)。检查它的方法是通过 tell-tale gcc -E:

struct API_ABSTRACT overriden

使用 -E,gcc 将显示预处理的输出,并且 API_ABSTRACT 显而易见,这意味着预处理器对此一无所知。

当 C++ 编译器看到此构造 (struct API_ABSTRACT overridden) 时,它认为(根据语法并且如果您授予编译器认知)overriden 是类型 API_ABSTRACT 的变量。接着是大括号,它将构造转换为所述变量的初始化。然而,类型 API_ABSTRACT 从未被定义,所以编译器抱怨初始化一个不完整类型的变量。