小编典典

const 之前还是 const 之后?

all

首先,您可能知道它const可用于使对象的数据或指针不可修改或两者兼而有之。

const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer

但是,您也可以使用以下语法:

Object const *obj; // same as const Object* obj;

似乎唯一重要的是您将const关键字放在星号的哪一侧。就我个人而言,我更喜欢放在const类型的左侧来指定它的数据是不可修改的,因为我发现它在我从左到右的思维方式中读起来更好,但是哪个语法先出现?

更重要的是,为什么有两种正确的const数据指定方式?在什么情况下,如果有的话,您更喜欢或需要其中一种方式?

编辑:

因此,在我出生之前很久就起草了编译器应该如何解释事物的标准时,这听起来像是一个武断的决定。因为const应用于关键字左侧的内容(默认情况下?)我猜他们认为添加
“快捷方式” 以其他方式应用关键字和类型限定符没有害处,至少在声明更改之前解析 * 或 & …

这也是C中的情况,然后我假设?


阅读 46

收藏
2022-08-16

共1个答案

小编典典

为什么有两种正确的const数据指定方式?在什么情况下,如果有的话,您更喜欢或需要其中一种方式?

从本质上讲,inside 说明符在星号之前的位置const无关紧要的原因是 C 语法是由 Kernighan 和 Ritchie 以这种方式定义的。

他们以这种方式定义语法的原因很可能是他们的 C
编译器从左到右解析输入,并在消耗每个标记时完成处理。使用*令牌会将当前声明的状态更改为指针类型。遇到constafter*意味着const限定符应用于指针声明;*在限定符应用于指向的数据之前遇到它。

因为如果限定符出现在类型说明符之前或之后,语义不会改变const,所以无论哪种方式都可以接受。

声明函数指针时会出现类似的情况,其中:

  • void * function1(void)声明一个返回的函数void *

  • void (* function2)(void)声明一个指向返回的函数的 函数指针void

再次需要注意的是语言语法支持从左到右的解析器。

2022-08-16