假设T
是一个任意类型,我们正在谈论Objective-C。那么
static T const x = ....
和
static const T x = ....
答案 0 :(得分:2)
他们是一样的。
关于const
的一些背景知识:
Objective-C,就像C一样,使用Clockwise/Spiral Rule。如果您在变量(foo)的左侧只有修饰符,则会读取从右到左的内容:
int * const * var;
读取: var是指向整数的常量指针的指针。
但是const
在第一种类型之前或之后具有相同的效果:
int const var; // constant integer
const int var; // constant integer, same as above
static
会影响整个变量:它是变量是静态的,而不是它指向的元素或其他任何东西:指向整数的指针既可以用来指向一个静态整数,也可以用于一个没有区别的自动整数,C不提供语法来声明一个只能指向静态变量(或自动变量)的指针。
static int * x; // x is a static pointer to integer
int static * y; // as above y is a static pointer to integer
int * static z; // THIS SYNTAX IS NOT ALLOWED
// but if it was, it would mean the same thing
出于这个原因,我更喜欢将它放在任何const
修饰符之前,但它实际上并不重要。
static const int * const * x; // this is what I do
答案 1 :(得分:1)
我认为区别仅对指针类型很重要;例如'char *'。
const char *p
表示p
指向的缓冲区无法更新,但指针p
本身可以更改(通常用p ++增加,例如:
void f(const char *p)
{
while (*p != '\0')
{
putc(*p);
p++;
}
}
char * const p
表示p
指向的缓冲区可以更新,但指针p
无法更改。
编辑感谢JeremyP发表以下评论:
在Apple的API中定义字符串常量(而不是使用#defines)是很常见的,特别是如果字符串是NSString,即NSString * const kFoo = @"bar";