0

我有一些头文件,其中包含一些简单的美化structs,其中仅定义了纯虚拟方法。代码在带有 Visual Studio 2015 的 Windows 上编译良好,但 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 编译时这段代码不起作用?

谢谢你。


编辑#1


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

struct API_ABSTRACT overriden

因此,罪魁祸首似乎是API_ABSTRACT宏,它的评估结果为零。

4

1 回答 1

1

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

struct API_ABSTRACT overriden

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

当 C++ 编译器看到这个构造 ( struct API_ABSTRACT overridden) 时,它认为(根据语法和如果您授予编译器的认识)这overriden是一个 类型的变量API_ABSTRACT。后面是大括号,它将构造转换为所述变量的初始化。但是,从未定义过 API_ABSTRACT 类型,因此编译器抱怨初始化类型不完整的变量。

于 2016-04-07T20:27:55.650 回答