Как заставить компилятор Xcode 3.1 предупреждать об операторе присваивания в операторе if? - PullRequest
0 голосов
/ 10 сентября 2009

Я попытался найти документацию и Интернет как можно лучше, но мне не удалось заставить компилятор Xcode выдать предупреждение, если в операторе if используется оператор присваивания.

Я приехал из RealBasic, где у меня чрезвычайно сильная привычка вводить сравнение такого типа:

if x = 5 then ...

Конечно, в C этот синтаксис присваивает x значение 5, а затем проверяет результат, чтобы определить, ненулевой ли он, и "правильный" ли оператор:

if (x == 5) { ... }

Я обнаружил несколько упоминаний о том, что компилятор должен иметь возможность предупреждать, если в сравнении if выполнено присвоение, но я не могу найти, как включить его в Xcode 3.1 / gcc. Я нашел опцию -pedantic, но это не выдает предупреждение.

Поскольку я дважды потратил довольно много времени на отслеживание ошибок, которые оказались "=" вместо "==", я бы хотел получить предупреждение.

Я знаю, что вместо этого могу сделать это (что приведет к ошибке компилятора):

if (5 = x) { ... }

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 сентября 2009

Ссылка в ответе ennuikiller привела к тому, что мне нужно.

Вот немного больше информации для тех, кто может найти это в будущем:

  • Предупреждение компилятора: «Отсутствуют скобки и скобки», или -Wparentheses.

  • Предупреждение включается при выборе Get Info для текущего цель в Xcode.

  • Как я наконец узнал, iPhone Simulator SDK не показывает эта опция компилятора.

  • Переключение SDK на устройство iPhone покажет предупреждения GCC 4.2 раздел, в который входит «Пропавшие» фигурные скобки и скобки ".

  • После включения этой опции в iPhone Device SDK, переключение обратно Симилятор показывает, что «Определяемый пользователем» параметр сборки был добавлено: GCC_WARN_MISSING_PARENTHESES = "YES".

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

(Пример с двойными скобками:)

if ((x = 5)) { ... }

Предупреждение работает как брелок, хотя и не соответствует стандарту Apple:

if (self = [super init]) { ... }

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

Спасибо!

1 голос
/ 10 сентября 2009

Вы ищете вариант -Wall, я думаю.

int main(void) {

    int x = 5;
    if ( x=5) { 
    }
    return 0;
  }

$ g++ -pedantic x.cc 
$ g++ -Wall x.cc 
x.cc: In function ‘int main()’:
x.cc:7: warning: suggest parentheses around assignment used as truth value

Эта ссылка описывает, как включить опции через графический интерфейс Xcode

...