我有一些头文件,其中包含一些简单的美化 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/