Почему синтаксис ключевого слова «bool» выделен в Xcode, настроенном для C89?

Я читал, что логические значения в C впервые появились в C99. Теперь мне интересно, почему bool тем не менее окрашивается подсветкой синтаксиса Xcode или как вы это называете...
Когда кто-то ищет «набрать» в настройках сборки в Xcode, всплывает «Диалект языка», и там я «набираю -in" в стандарте C89, и по-прежнему bool окрашивается.

Это почему?

Я также прочитал это:
Использование логических значений в C

и я вижу, как они это сделали, но я также не понимаю, как работают примеры 3 и 4...

Option 3
typedef int bool;
enum { false, true };

Option 4
typedef int bool;
#define true 1
#define false 0

Примечание: я не понимаю, как typedef int bool; вообще может быть связано с линией enum { false, true };.

Почему xcode с C89 не игнорирует ключевое слово bool?
Как работают примеры?


person Community    schedule 27.02.2020    source источник
comment
Я думаю, вполне вероятно, что подсветка синтаксиса Xcode просто не обращает внимания на настройку диалекта языка. Ваш вариант 3 и вариант 4 компилируются в режиме C89? Они должны, пока вы этого не сделаете #include <stdbool.h>.   -  person zwol    schedule 27.02.2020
comment
Xcode - это IDE, а не компилятор. У него есть свои правила.   -  person Eugene Sh.    schedule 27.02.2020
comment
Кроме того, вы должны знать, что bool, true и false не являются ключевыми словами даже в последней версии стандарта C. C99 добавил настоящий логический тип type и ключевое слово _Bool, но программы, которые определяют bool, true и false по своему усмотрению, по-прежнему действительны в C99 и более поздних версиях (опять же, если они не включают stdbool.h ). Это преднамеренное отличие от C++.   -  person zwol    schedule 27.02.2020
comment
Привет! я не пробовал варианты 3 и 4, так как не понимаю, как typedef int bool; в любом случае может быть связано со строкой enum {false, true};   -  person    schedule 27.02.2020
comment
@Nickname Помогает ли я вам, если я скажу вам, что константы, определенные объявлением enum, имеют тип int?   -  person zwol    schedule 27.02.2020
comment
меня не волнует последняя версия C, только C89...   -  person    schedule 27.02.2020
comment
@zwol Я знаю, что это int, но все равно это сбивает с толку. я выбираю вариант 2 тогда   -  person    schedule 27.02.2020
comment
typedef int bool; bool { true, false }; не стал бы делать то, что нужно...   -  person zwol    schedule 27.02.2020
comment
typedef enum bool_t { b_false = 0, b_true = 1 } bool; - это то, что я использую, а также эти флаги -Wall -pedantic -std=c89, и все равно они становятся цветными   -  person    schedule 27.02.2020


Ответы (1)


Подсветка синтаксиса — это приближение, используемое XCode; не гарантируется соответствие какому-либо стандарту. Не сказать, что подсветка синтаксиса в XCode недостаточно продвинута, но она была бы очень трудно сказать без компиляции для конкретного стандарта, что именно означают символы, в режиме реального времени.

В случае Варианта 3 выполняется неявное преобразование из анонимного enum на int. Поскольку они являются совместимыми типами, это «всегда не работает и не меняет представление». Значения перечисления по умолчанию для { false, true } являются { 0, 1 }, поэтому это должно привести к тому же результату на ассемблере. Этот ответ имеет порядок предпочтения, когда не знаешь, что выбрать.

person Neil    schedule 27.02.2020