正如我在c标准中所读到的那样,地址常数应该是这样限定的:
int * const ptr
,
我问自己,也会工作int const i
,而不是const int i
。
它确实如此。
在我注意到他们是平等的之后我只是尝试了一下,以获得const
的表现。我做了像
int * const * pPtr
和int const * ptr
,
我通知了,他们都会对const
进行处理,好像定义是:
“const限定了左边的类型,就像左边没有类型一样,它应该是正确的部分”
但我在标准中找不到任何相关内容。
标准中的每个示例都在声明开始时使用const
或在static
部分后面写入。
(至少不会拒绝我的建议......)
那么为什么所有人都会在声明开始时使用const,因为它会像我提到的那样更容易理解?
根据假设编译器支持两种方式,如何正确地将标识符定义为const
?
答案 0 :(得分:2)
那么为什么几乎每个人都在声明开始时使用const,因为它比我提到的方式更容易理解?
这只是一种编码风格,都是有效的语法。
C11§6.7声明
语法
声明:
declaration-specifiers init-declarator-listopt;
static_assert声明
声明-指示符:
storage-class-specifier declaration-specifiers opt
type-specifier declaration-specifiers opt
type-qualifier declaration-specifiers opt
function-specifier declaration-specifiers opt
alignment-specifier declaration-specifiers opt
初始化声明符列表:
初始化声明符
init-declarator-list,init-declarator
初始化声明符:
声明符
declarator = initializer
请注意,我使用粗体,类型说明符的行是int
,char
或void
等关键字。 类型限定符是const
volatile
等关键字。
根据标准,声明说明符是递归定义的,这就是const int i
和int const i
都有效的原因:
int const i;
// | |
//type-specifier type-qualifier
// \______________/
// |
// declaration-specifier
const int i;
// | |
// | type-specifier
// | |
//type-qualifier declaration-specifier
// \__________________/
// |
// declaration-specifier
答案 1 :(得分:0)
经验法则:将const
移到*
上会产生影响。否则就不会。
答案 2 :(得分:0)
int * const foo1
foo1
是“指向int的const指针”。 foo1
的值是不变的。 foo1
指向的内容可能会发生变化。
int const foo2
const int foo3
foo2
和foo3
属于同一类型 - 两者都是正确的 - C允许两者。 int
和const
的顺序是样式选择。在这两种情况下,标识符都是常量。根据我的经验,首先const
更为常见。因此,我倾向于遵循现有技术。进一步 - 只要它与模块一致,我发现要么好。
在这两种情况下,人们都希望找到像const int foo3 = 7;
但也需要解决一些混乱问题 [编辑答案如下]
// OP's experimented with these
int * const * foo4;
int const * foo5;
OP推测,“const限定了左边的类型,就像左边没有类型一样,它应该是正确的部分”。这可以解释为这2并且似乎适用于其他样品:
foo4
是“指向int指针的指针”
foo5
是“指向const int的指针”。
其他样本:
int * const foo6;
const int* foo7;
int const * const foo8;
foo6
是“指向int的const指针”
foo7
是“指向const int的指针” - 与foo5
相同
foo8
是“指向const int的const指针”。
foo6
是常量,它指向的数据不常量
foo7
不常量,指向的数据视为常量。
foo8
是不变的。它指向的数据被视为常数。
const
内移动*
的帖子中, @ugoren 正确无误。移动const
会更改类型。这不是风格差异,而是代码不同。
参考:
C11 6.2.5.29“示例1指定为''float *''的类型具有'float'类型''。其类型类别是指针,而不是浮点类型。此类型的const限定版本是指定为''float * const'',而指定为''const float *''的类型不是限定类型 - 它的类型是''指向const-qualified float''的指针,并且是指向限定类型的指针。“
C11 6.7