const结构声明

时间:2011-10-04 11:54:08

标签: c struct const declaration

有人可以告诉我这两个版本的结构声明之间的区别吗?

struct S
{
  uint8_t a;
};

const struct S
{
  uint8_t a;
}

其次是:

void main(void)
{
  struct S s = {1};
  s.a++;
}

提示,我在Visual Studio C ++ 2010 Express中尝试过S的两个版本,所以我知道这两个版本都会编译错误。

“const struct”什么都不做? “const struct S s = {1};”当然可以,但目前不是问题。

此致 富

/********************************************/

我刚刚解决了什么

const struct <typename> <{type}> <variable instances a, b, .., z>;

正在做:

当const出现在“struct”之前时,所有变量实例都是const,就好像它们是用以下定义的那样:

const struct <typename> a, b, z;

所以它确实做了一些事情,但是当没有与struct声明符合的实例定义时就没有。

7 个答案:

答案 0 :(得分:4)

结构声明只定义数据类型。

const限定符适用于不是数据类型的变量。因此,在结构声明之前添加const最多应该是多余的。

答案 1 :(得分:4)

使用:

const struct S
{
  uint8_t a;
};

const限定符有无意义,甚至可能导致某些C编译器出现编译错误。 gcc发出警告。

意图似乎是声明数据类型struct S。在这种情况下,正确的语法是:

struct S
{
  uint8_t a;
};

答案 2 :(得分:2)

const struct S
{
  uint8_t a;
};

不是有效的构造。

这个

const struct S
{
  uint8_t a;
} x;

可能有效,因为您声明变量x现在为const,这意味着它无法更改。

答案 3 :(得分:2)

const限定符适用于变量或成员。 要实例化const变量,只需在实例化期间指定const

const的作用是:

  • 在编译期间,验证是否只对const变量执行了读取
  • 如果使用可在编译期间解析的值创建const变量,则将变量放入程序存储器

const应用于成员时,例如:

struct T {
    int const i;
    int j;
};

您只能(合法地)在创建结构期间分配值i。 您可以通过将其转换为非const类型( const-cast )来修改const值(如果程序存储器位于RAM而不是ROM中),但这是某种东西你不应该这样做。

const-cast的典型用法是当你使用一个没有在函数声明中指定constness的库时,你的代码就是这样。此时如果你想使用它,你必须信任它并在调用它的函数之前转换参数。

答案 4 :(得分:0)

宣布

const var;

然后它为它分配一些内存空间,但

struct var;

它只是一个声明编译器没有为它分配任何空间。 所以它显示错误,在const结构中你没有声明任何变量看到代码所以它显示错误。

答案 5 :(得分:0)

const之前使用struct关键字是无稽之谈。

如果您使用gcc编译器,它会显示以下警告:

  

警告:空声明中的无用类型限定符[默认启用]

答案 6 :(得分:0)

这是我唯一想到的用途:

const struct S {
        int a;
        int b;
} s;

这将声明一个结构,并立即为其创建一个名为s的实例,此时a中的bs被初始化为0(请注意,在这一点上,s是翻译单元中的全局变量,已在其中声明该变量,并且可以在外部链接到该变量。)

printf("a = %d\t b = %d\n", s.a, s.b); // a = 0     b = 0

如果您尝试设置s的成员,则会失败:

s.a = 1; //error: assignment of member ‘a’ in read-only object

因此,s在这里并不是真正有用的...除非您执行以下操作:

const struct S {
        int a;
        int b;
} s =  { 1, 2 };

现在让我们创建具有相同结构的另一个实例(声明仍然与上面相同):

    struct S other;
    other.a = 1;
    other.b = 2;

    printf("a = %d\t b = %d\n", other.a, other.b); // a = 1     b = 2

编译器不会再抱怨了,因为other不是const!只有s是常量!

现在,您可能会问const会做什么?让我们尝试更改s:

s = other; // error: assignment of read-only variable ‘s’

仅此而已。如果您不需要编译器在声明时为s分配存储,而仍然需要s的实例作为const,则只需在实例化时添加const {1}}(注意大写的S !!)

奖金1

struct S

请注意,已经没有小的const struct S { int a; int b; }; 。此时,GCC会警告s限定词不起作用!!!!

奖金2

如果您希望结构的每个实例都是const,则只能在定义时初始化其成员(使用typedef):

const

结论

对我来说,这只是语法糖,只会给代码增加不必要的复杂性。但是我要判断谁...