什么是正确使用const限定符?

时间:2013-08-29 08:40:42

标签: c c99 c11

正如我在c标准中所读到的那样,地址常数应该是这样限定的:

int * const ptr

我问自己,也会工作int const i,而不是const int i

它确实如此。

在我注意到他们是平等的之后我只是尝试了一下,以获得const的表现。我做了像

这样的事情 不同编译器中的

int * const * pPtrint const * ptr, 我通知了,他们都会对const进行处理,好像定义是:

  

“const限定了左边的类型,就像左边没有类型一样,它应该是正确的部分”

但我在标准中找不到任何相关内容。 标准中的每个示例都在声明开始时使用const或在static部分后面写入。

(至少不会拒绝我的建议......)

那么为什么所有人都会在声明开始时使用const,因为它会像我提到的那样更容易理解?

根据假设编译器支持两种方式,如何正确地将标识符定义为const

3 个答案:

答案 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

请注意,我使用粗体类型说明符的行是intcharvoid等关键字。 类型限定符const volatile等关键字。

根据标准,声明说明符是递归定义的,这就是const int iint 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)

哇,有很多'const'在继续。


int * const foo1

foo1是“指向int的const指针”。 foo1的值是不变的。 foo1指向的内容可能会发生变化。


int const foo2
const int foo3

foo2foo3属于同一类型 - 两者都是正确的 - C允许两者intconst的顺序是样式选择。在这两种情况下,标识符都是常量。根据我的经验,首先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

http://cdecl.org/