инициализация статической переменной в C ++ vs C [duplicate]

NSUserDefaults довольно прост в использовании и сохраняет одно значение только для ключа. Но, по-видимому, это не очень безопасный метод, поскольку шифрования нет.

Но Keychain безопасен, хотя его немного сложно закодировать. Вы можете ссылаться на эту ссылку, чтобы использовать доступ к keychain.

http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code

вы также можете использовать эту библиотеку, разработанную Саймоном

https://github.com/goosoftware/GSKeychain

Надеюсь, это поможет вам!

20
задан Community 23 May 2017 в 10:33
поделиться

3 ответа

Он компилируется в C ++, потому что C ++ должен поддерживать динамическую инициализацию в любом случае, или вы не можете иметь локальные статические или нелокальные объекты с нетривиальными конструкторами.

Так как C ++ имеет такую ​​сложность в любом случае, поддержка этой инициализации, как вы показываете, не сложнее добавить.

В C это было бы большой проблемой, потому что у C нет других причин поддерживать инициализацию при запуске программы (кроме тривиальной инициализации нуля ). В C исходные значения области видимости файла или локальных статических объектов всегда можно статически помещать в исполняемый образ.

10
ответ дан Johannes Schaub - litb 16 August 2018 в 04:48
поделиться
  • 1
    Благодарю. Я смотрю что-то похожее на это. Поэтому, когда у нас есть --- static char * p = "lol" ; lol находится в области только для чтения сегмента данных, а p находится в области чтения и записи. Теперь, когда есть динамическая инициализация, как компилятор знает значение во время выполнения? Я предполагаю, что это может потребовать другого вопроса самостоятельно, так что только смысл. – Anon 7 May 2011 в 16:39
  • 2
    @ Я не понимаю ваш вопрос. Какую ценность он должен знать? – Johannes Schaub - litb 7 May 2011 в 16:44
  • 3
    Виноват. Я не был достаточно ясен. В основном я хотел знать, что компилятор хранит как значение статических переменных, когда они динамически инициализируются. После немного Googling, я смог найти ответ. Спасибо, что указал мне в правильном направлении и своевременно. (Для тех, кто хочет знать ответ - компилятор сначала предоставит значение по умолчанию, а затем значение будет заменено фактическим значением во время выполнения. Таким образом, это один случай, когда значение статической переменной не будет в доступная только для чтения часть сегмента данных) – Anon 7 May 2011 в 17:01
  • 4
    @ Незначительно это будет пустой указатель между запуском программы и началом ее динамической инициализации. см. stackoverflow.com/questions/3309042/what-does-main-return – Johannes Schaub - litb 7 May 2011 в 17:04
  • 5
    @Anon C ++ нечего сказать о сегментах, только для чтения или иначе. Это (не очень интересная) деталь вашей конкретной реализации. – Neil Butterworth 7 May 2011 в 17:09

Статические переменные в C необходимо инициализировать со значением, известным во время компиляции. Это требование было удалено на C ++, и вы можете инициализировать их выражениями, оцененными во время выполнения.

Эти два языка различаются и многие, многие другие. Вы можете легко написать код C, который будет приемлемым для компилятора C ++, но обратное неверно.

3
ответ дан Neil Butterworth 16 August 2018 в 04:48
поделиться

6.7.8 / 4 [C99]

Все выражения в инициализаторе для объекта с длительностью статического хранения должны быть постоянными выражениями или строковыми литералами.

В static int i = initializer(); RHS не является постоянным выражением, поэтому код не компилируется в C.

В C ++ такого ограничения нет и код корректно сформирован в C ++.

7
ответ дан Prasoon Saurav 16 August 2018 в 04:48
поделиться
  • 1
    Вопрос в том, почему это компилируется в C ++. – Blagovest Buyukliev 7 May 2011 в 16:31
  • 2
    @Blagovest Buyukliev В основном потому, что это другой язык . – cnicutar 7 May 2011 в 16:32
  • 3
    Почему, черт возьми, это задерживается? – Neil Butterworth 7 May 2011 в 16:35
  • 4
    @unapersson: потому что это не имеет значения - OP уже говорит « Этот код не будет компилироваться на C. Это нормально. & quot ;. – Blagovest Buyukliev 7 May 2011 в 16:38
  • 5
    @Blagovest - вопрос Difference between initialization of static variables in C and C++, поэтому ответ, который показывает, что по-другому кажется особенно актуальным ... – Chris Dodd 7 May 2011 в 19:03
Другие вопросы по тегам:

Похожие вопросы: