在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?
当我在g ++ - 4.2中看到以下代码编译没有错误或警告时,我感到非常惊讶:
typedef enum test { one };
Run Code Online (Sandbox Code Playgroud)
我的假设是,如果您使用typedef关键字,则需要额外的标识符,如:
typedef enum test { one } test;
Run Code Online (Sandbox Code Playgroud)
如前所述,g ++ - 4.2在没有警告的情况下接受它.Clang ++ 3.0警告" 警告:typedef需要一个名字 ",类似的Comeau警告" 警告:声明需要一个typedef名称 ",并且g ++ - 4.6通知:" 警告:'typedef'在此声明中被忽略 ".
我无法确定标准中允许的位置,并且我发现有两个编译器警告它是必需的,这有点令人困惑,如果typedef-name是必需的但不存在则不应该是错误吗?
更新:我用相同的编译器检查了C.Clang和comeau产生相同的输出,gcc发出警告:" 警告:空声明中无用的存储类说明符 ",这看起来更令人困惑.
更新:我已检查删除枚举的名称,结果是相同的:
typedef enum { one };
Run Code Online (Sandbox Code Playgroud)
与命名结构类似:
typedef struct named { int x };
Run Code Online (Sandbox Code Playgroud)
但是没有一个未命名的结构,在这种情况下,代码在g ++(4.2/4.6)中被拒绝" 错误:在typedef-declaration中缺少type-name ",gcc(4.2/4.6)发出警告:" warning:unnamed struct/union定义没有实例 ",clang ++" 警告:声明没有声明任何 ",comeau" 错误:声明需要typedef名称 "
我的代码中通过相同的声明多次触发此警告,其内容如下:
// Spreadsheet structure
typedef struct SPREADSHEET
{
int ID; // ID of the spreadsheet
UINT nLines; // Number of lines
void CopyFrom(const SPREADSHEET* src)
{
ID = src->ID;
nLines = src->nLines;
}
};
Run Code Online (Sandbox Code Playgroud)
我不想只是关掉那个警告,
而是更改代码,以便警告不会出现!
注意:我不想在这里声明任何变量(它是一个头文件),只定义结构'SPREADSHEET'应包含的内容......