Смущает правильность const со статическим массивом указателей на const объекты - PullRequest
4 голосов
/ 25 октября 2009

Я все еще не уверен, что полностью понял, как должен работать этот конкретный случай. Так что, если я хочу объявить массив NSStrings, который не изменится, это правильно?

static NSString * const strings[] = {@"String 1", @"String 2", ...};

Нужно ли static? (что он делает?) Я пропускаю где-то лишние const? Там слишком много мест, куда можно пойти! Г! Я делаю это неправильно или я просто параноик?

Ответы [ 2 ]

7 голосов
/ 25 октября 2009

Что у вас есть:

static NSString * const strings[] = {@"String 1", @"String 2", ...};

Массив неизменных указателей.

Возможно, вы захотите:

static NSString const *strings[] = {@"String 1", @"String 2", ...};

Массив указателей на неизменяемые NSString объекты.

или

static NSString const * const strings[] = {@"String 1", @"String 2", ...};

Массив неизменных указателей на неизменяемые NSString объекты.

"Правило спирали по часовой стрелке" - это метод, который я использую для интерпретации объявлений на языке C.

Ключевое слово static означает, что «продолжительность хранения» массива указана для всего срока службы программы. Если объявление находится в функции, то массив не исчезнет, ​​когда функция вернется (хотя область действия будет по-прежнему только для этой функции). Если объявление находится в области видимости файла, ключевое слово static сделает имя массива видимым только в пределах этого блока компиляции (т. Е. Исходного файла). Другой исходный файл не может получить доступ к массиву через объявление extern.

1 голос
/ 25 октября 2009

Вы читаете объявления C изнутри, сначала двигаясь вправо к операторам с сильными связями, таким как [], а затем двигаясь влево. Итак, у вас есть: строки, массив констант, указатели на NSString, которые являются статическими.

Это совершенно разумно, но не то, что вы сказали, что хотели.

Для создания указателей на константные строки вам понадобится const на другой стороне *, поэтому у вас будут строки, массив указателей на константу, NSString, которые являются статическими.

Вы можете поставить const в обоих местах, если хотите.

Использование static класса хранения немного похоже на определение переменной класса. Это то же самое, что static в C99, лексическая область уровня модуля.

...