有人可以告诉我这两个版本的结构声明之间的区别吗?
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声明符合的实例定义时就没有。
富
答案 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
应用于成员时,例如:
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
中的b
和s
被初始化为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
结论
对我来说,这只是语法糖,只会给代码增加不必要的复杂性。但是我要判断谁...