相关疑难解决方法(0)

C中的静态断言

在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?

c gcc assert static-assert compile-time

79
推荐指数
4
解决办法
6万
查看次数

typedef声明中的typedef-name是否可选?

当我在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名称 "

c c++ typedef

34
推荐指数
1
解决办法
3万
查看次数

如何在没有声明变量的情况下删除VS警告C4091:'typedef':忽略'SPREADSHEET'左侧

我的代码中通过相同的声明多次触发此警告,其内容如下:

// 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'应包含的内容......

c++ compiler-construction struct warnings typedef

13
推荐指数
3
解决办法
3万
查看次数