首先,您可能知道 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中的情况,然后我假设?
原文由 AJG85 发布,翻译遵循 CC BY-SA 4.0 许可协议
从本质上讲,
const
在说明符中星号之前的位置并不重要,因为 C 语法是由 Kernighan 和 Ritchie 定义的。他们以这种方式定义语法的原因很可能是他们的 C 编译器从左到右解析输入,并在消耗每个标记时完成处理。使用
*
标记将当前声明的状态更改为指针类型。在const
*
意味着const
限定符应用于指针声明;在*
之前遇到它意味着限定符应用于指向的数据。因为如果
const
限定符出现在类型说明符之前或之后,语义不会改变,因此无论哪种方式都可以接受。声明函数指针时会出现类似的情况,其中:
void * function1(void)
声明一个返回void *
的函数,void (* function2)(void)
声明一个指向返回void
的函数的 _函数指针_。再次需要注意的是语言语法支持从左到右的解析器。