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

Пытаясь исправить это, я написал

__weak typeof(self) weakSelf = self;

Для создания слабой ссылки для использования внутри блока.

Однако Xcode v. 5.1.1 дает загадочное предупреждение

Lexical or Preprocessor Issue 
Extension used

Я здесь в недоумении - что это значит и как от этого избавиться?

6
JRG-Developer 26 Авг 2014 в 21:42

1 ответ

Лучший ответ

Вы получаете это предупреждение при использовании typeof, если "педантичные предупреждения" включены в настройках сборки. В «Быстрой справке» для этого параметра:

Описание Выдавать все предупреждения, требуемые строгими стандартами ISO C и ISO C ++; отклонить все программы, использующие запрещенные расширения, а также некоторые другие программы, не соответствующие ISO C и ISO C ++. Для ISO C следует версии стандарта ISO C, заданной любой используемой опцией -std. [GCC_WARN_PEDANTIC, -pedantic]

Я не эксперт в стандартах (ISO) C, но согласно https://gcc.gnu.org/onlinedocs/gcc/Typeof.html:

Если вы пишете файл заголовка, который должен работать при включении в ISO C программ напишите __typeof__ вместо typeof. См. Альтернативные ключевые слова.

И http://clang.llvm.org/docs/UsersManual.html:

Парсер распознает «asm» и «typeof» как ключевые слова в режимах gnu *; варианты «__asm__» и «__typeof__» распознаются во всех режимах.

Вместо этого вы можете использовать __typeof__ если вы не хотите отключать предупреждение:

__weak __typeof__(self) weakSelf = self;
10
Martin R 26 Авг 2014 в 22:44
В разделе Apple LLVM 5.1 - Warning Policies настройка для Pedantic Warnings - NO. Где еще это можно было бы включить?
 – 
JRG-Developer
26 Авг 2014 в 22:54
Установлены ли пользовательские флаги, например "-Все"?
 – 
Martin R
26 Авг 2014 в 22:56
Вот что было! Спасибо, Мартин!
 – 
JRG-Developer
26 Авг 2014 в 22:58