GCC - "has initializer but incomplete type" 将宏用于函数属性时出错
GCC - "has initializer but incomplete type" error when using macros for function attributes
我有一些 header 文件,其中包含一些简单的美化 struct
,其中只定义了纯虚拟方法。代码在 Windows 和 Visual Studio 2015 上编译良好,但 GCC 卡住了。一、代码:
代码清单
namespace CustomUtils
{
interface API_ABSTRACT overriden
{
virtual int GetStatus() const = 0;
};
}
在导入的 header 文件中,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
进行编译,以便将 post-"pre-processed" 源呈现到屏幕上以查看 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_ABSTRACT
的变量。接着是大括号,它将构造转换为所述变量的初始化。然而,类型 API_ABSTRACT 从未被定义,所以编译器抱怨初始化一个不完整类型的变量。
我有一些 header 文件,其中包含一些简单的美化 struct
,其中只定义了纯虚拟方法。代码在 Windows 和 Visual Studio 2015 上编译良好,但 GCC 卡住了。一、代码:
代码清单
namespace CustomUtils
{
interface API_ABSTRACT overriden
{
virtual int GetStatus() const = 0;
};
}
在导入的 header 文件中,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
进行编译,以便将 post-"pre-processed" 源呈现到屏幕上以查看 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_ABSTRACT
的变量。接着是大括号,它将构造转换为所述变量的初始化。然而,类型 API_ABSTRACT 从未被定义,所以编译器抱怨初始化一个不完整类型的变量。