Разница между статическим T const и статическим const T - PullRequest
1 голос
/ 12 января 2011

Предполагая, что T - произвольный тип, и мы говорим об Objective-C.Тогда в чем же разница между

static T const x = ....

и

static const T x = ....

?

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Они одинаковы.


Небольшой фон о const:

Objective-C, как и C, использует Правило по часовой стрелке / спираль . В случае, когда у вас есть только модификаторы в левой части переменной (из 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 голос
/ 12 января 2011

Я считаю, что различие важно только для типов указателей;например 'char *'.

const char *p означает, что буфер, на который указывает p , не может быть обновлен , но сам указатель p может быть изменен(обычно увеличивается с помощью p ++), например:

void f(const char *p)
{
    while (*p != '\0')
    {
        putc(*p);
        p++;
    }
}

char * const p означает, что буфер, на который указывает p , может быть обновлен, но указатель p не может быть измененным.

РЕДАКТИРОВАТЬ Спасибо за JeremyP за следующий комментарий:

В API Apple довольно часто определяют строковые константы (вместо использования #defines)особенно если строка является строкой NSSt т.е. NSString * const kFoo = @"bar";

...