“无用的类型限定符”错误

时间:2012-06-11 10:26:09

标签: c struct

我使用以下代码收到以下错误。我试图找出问题在谷歌的哪个方面,但我没有找到任何帮助。

Compiling /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c
In file included from /home/tectu/projects/resources/chibios/ext/lcd/touchpad.c:1:0:
/home/tectu/projects/resources/chibios/ext/lcd/touchpad.h:17:1: warning: useless type qualifier in empty declaration [enabled by default]

以下是来自touchpad.h的第12行到第17行的代码:

volatile struct cal {
    float xm; 
    float ym; 
    float xn; 
    float yn; 
};

以下是我在touchpad.c中使用此结构的方法:

static struct cal cal = { 
    1, 1, 0, 0  
};

有人能告诉我光明吗? :d

6 个答案:

答案 0 :(得分:7)

作为限定符的

volatile可以应用于特定的结构实例 您正在将它应用于无用的类型,并且编译器正确指出它。

答案 1 :(得分:6)

volatile限定变量,而不是类型。

这样做的:

static volatile struct cal {
    float xm; 
    float ym; 
    float xn; 
    float yn; 
} cal;

将是合法的,如下:

struct cal {
    float xm; 
    float ym; 
    float xn; 
    float yn; 
};

static volatile struct cal cal;

答案 2 :(得分:5)

volatile关键字对某个对象有意义。不是类型定义。

答案 3 :(得分:5)

您不会收到错误,只会收到警告。

这适用于你如何声明你的struct cal:它本身并不易变; volatile只适用于具体的变量定义。

所以在static struct cal cal中,您的变量cal只是static,而不是volatile

从这个意义上说,正如警告所说,volatile声明是无用的。

答案 4 :(得分:0)

易失性密钥工作应该与实际变量一起使用,而不是类型定义。

答案 5 :(得分:0)

您无法将volatile限定符附加到struct声明。

但是,与其他答案相反,您实际上可以在类型上使用volatile限定符,但结构上的。如果使用typedef,则可以为结构创建易失性类型。

在以下示例中,Vol_struct实际上并不易变,就像海报的问题一样。但Vol_type将创建不稳定变量而无需进一步限定:

/* -------------------------------------------------------------------- */
/* Declare some structs/types                                           */
/* -------------------------------------------------------------------- */

/* wrong: can't apply volatile qualifier to a struct
   gcc emits warning: useless type qualifier in empty declaration */
volatile struct Vol_struct
{
    int x;
};

/* effectively the same as Vol_struct */
struct Plain_struct
{
    int x;
};

/* you CAN apply volatile qualifier to a type using typedef */
typedef volatile struct
{
    int x;
} Vol_type;


/* -------------------------------------------------------------------- */
/* Declare some variables using the above types                         */
/* -------------------------------------------------------------------- */
struct Vol_struct g_vol_struct;                     /* NOT volatile */
struct Plain_struct g_plain_struct;                 /* not volatile */
volatile struct Plain_struct g_vol_plain_struct;    /* volatile */
Vol_type g_vol_type;                                /* volatile */