静态T const和静态const T之间的差异

时间:2011-01-12 07:57:23

标签: iphone objective-c c ios

假设T是一个任意类型,我们正在谈论Objective-C。那么

之间有什么区别
static T const x = ....

static const T x = ....

2 个答案:

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