GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误

Posted

技术标签:

【中文标题】GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误【英文标题】:GCC - "has initializer but incomplete type" error when using macros for function attributes 【发布时间】:2016-04-07 19:47:56 【问题描述】:

我有一些头文件,其中包含一些简单的美化 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 中使用define custom attributes 来限制我导出的 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 宏,它的计算结果为零。

【问题讨论】:

interface is typedefed to struct是什么意思? @SergeyA 请参考更新后的问题。将在 30 秒后更新。 typedef struct interface; 不是有效的 C++ 代码。 @SergeyA 再次更正。睡得很少,靠记忆工作。 向我们展示您在 GCC 中定义 API_ABSTRACT 的代码。 (实际代码,复制和粘贴,而不是你睡眠不足的回忆它应该是什么样子)。在该行的下方立即放置一个#error,并查看是否报告了错误。 【参考方案1】:

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

struct API_ABSTRACT overriden

使用-E,gcc 将显示预处理后的输出,而 API_ABSTRACT 清晰可见意味着预处理器对此一无所知。

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

【讨论】:

谢谢。但问题是:为什么编译器没有发出不那么模糊的警告,即:API_ABSTRACT 未定义? @Dogbert,编译器会尽最大努力猜测您的意图并为他们量身定制消息,但是当语法被粗暴地违反时,这很难。 再次感谢您的帮助!

以上是关于GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误的主要内容,如果未能解决你的问题,请参考以下文章

mex 编译时出现 GCC 版本警告

安装redis出现的问题

对函数进行字节编码时出现分段错误? [复制]

gcc编译程序时出现 double free or corruption (out) 报错的解决办法

Ubuntu 16.04下使用gcc输出汇编的.0文件为可执行文件时出现:`_start'被多次定义

使用具有不同优化的 gcc 时出现奇怪的反编译