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

标签 c++ visual-studio gcc macros function-attributes

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

代码 list


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 已就位,因此我可以将 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 进行编译,将“预处理”后的源代码呈现到屏幕上以查看 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_抽象。接着是大括号,它将构造转换为所述变量的初始化。然而,类型 API_ABSTRACT 从未被定义,因此编译器提示初始化了一个不完整类型的变量。

关于c++ - GCC - 将宏用于函数属性时出现 "has initializer but incomplete type"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485824/

相关文章:

c++ - boost::spirit::qi - 使用语法结构中的实例成员

c# - 为什么我在 Visual Studio 编辑器中得到 'Localizable string'?

visual-studio - Visual Studio 2017 HRESULT:0x80070005/项目创建时E_ACCESSDENIED

c++ - 如何将QTableView滚动到被移除元素之后/被移除元素之前的位置?

c++ - 如何使用键递增但值相同的方式初始化 std::map<int, int> ?

c++ - 将 ls 输出转换为整数

c++ - 视觉 C++ 2010 SP1

c++ - 未使用的类已删除

c - 为什么在 jmps 就足够时调用?

iphone - 在 Xcode 4.2 和 iOS SDK 5.0 中使用 gcc 4.2