GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误
Posted
技术标签:
【中文标题】GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误【英文标题】:GCC - "has initializer but incomplete type" error when using macros for function attributes 【发布时间】:2016-04-07 19:47:56 【问题描述】:我有一些头文件,其中包含一些简单的美化 struct
s,其中仅定义了纯虚拟方法。代码在带有 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 - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误的主要内容,如果未能解决你的问题,请参考以下文章
gcc编译程序时出现 double free or corruption (out) 报错的解决办法