Не можете определить переменные после какой-либо операции?

Мой учитель языка C утверждает, что все переменные должны быть определены перед любой операцией. Я как-то могу вспомнить, что это очень старая функция C (не позднее 1990 года), но я не могу воспроизвести ее с помощью GCC 7.2.0.

Мой учитель утверждает следующее:

int main(){
    int a; /* Valid */
    a = 1; /* An operation */
    int b; /* Invalid because an operation has already occurred */
    return 0;
}

Я пробовал компилировать с

gcc test.c -std=c89 -Wall -Wextra -pedantic

но он не дает ни ошибки, ни даже предупреждения.

Как я могу проверить (или доказать ошибочность) это утверждение?


person iBug    schedule 12.09.2017    source источник
comment
Fyi, эти // comments также недействительны в строгом c89. Я удивлен, если они тоже не будут отмечены gcc с включенными педантичными ошибками. clang определенно ловит их.   -  person WhozCraig    schedule 12.09.2017
comment
Готово!   -  person StoryTeller - Unslander Monica    schedule 12.09.2017
comment
У меня нет GCC 7.2.0, поэтому я не могу подтвердить, но мой gcc 6.3.0 Ubuntu выдает довольно много предупреждений.   -  person Antti Haapala    schedule 12.09.2017
comment
насколько я помню, когда компилятор генерирует объектный код, он перемещает все объявления в верхнюю часть видимой области видимости.   -  person bobra    schedule 12.09.2017
comment
@AnttiHaapala - онлайн-компилятор на coliru (моя ссылка) - это GCC 7.2.0. Скорее всего, это ошибка ОП.   -  person StoryTeller - Unslander Monica    schedule 12.09.2017
comment
@StoryTeller также, вот godbolt   -  person Antti Haapala    schedule 12.09.2017
comment
@AnttiHaapala Где я могу увидеть вывод компилятора? Я вижу только одну строку с <Compilation Failed>.   -  person iBug    schedule 12.09.2017
comment
Скажите своему учителю, что с 1989 года произошло несколько событий.   -  person Art    schedule 12.09.2017
comment
@iBug Преподавание ANSI C сегодня похоже на изучение Берлинской стены как текущих дел.   -  person Art    schedule 12.09.2017
comment
@iBug нажмите кнопку с символом /! \ в правом нижнем углу ...   -  person Antti Haapala    schedule 12.09.2017
comment
@Art Ну, это обязательный курс в моем университете. Если бы я мог, я бы выбрал современный курс C ++ (например, c ++ 1z).   -  person iBug    schedule 12.09.2017
comment
@iBug или C11. Или, по крайней мере, C99 (который достаточно стар, чтобы голосовать в большинстве стран). Я продолжаю видеть здесь вопросы, которые предполагают, что есть профессора, которые узнали что-то 30 лет назад и думают, что с тех пор ничего стоящего не произошло.   -  person Art    schedule 12.09.2017


Ответы (1)


Скомпилируйте с -pedantic-errors, например:

gcc test.c -std = c89 -Wall -Wextra -pedantic-errors

и вы должны увидеть эту ошибку (среди предупреждений о неиспользуемых переменных):

test.c:4:5: error: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int b;
     ^~~

в GCC 7.20.

PS: Комментарии тоже недействительны, перед компиляцией я их удалил.

person gsamaras    schedule 12.09.2017
comment
Также должна быть ошибка при попытке использования комментариев //, которые недопустимы в C89. - person M.M; 12.09.2017
comment
@ M.M У меня уже есть это как PM, так как я думал, что это не было намерением OP. Должен ли я исправить это, включив это в список ошибок компилятора? - person gsamaras; 12.09.2017
comment
Как я могу заставить GCC предупреждать меня о // комментариях с двойной косой чертой? - person iBug; 12.09.2017
comment
Если вы скомпилируете код в своем вопросе с помощью команды, которую я предоставил в своем ответе, вы увидите, что для этих комментариев вы получите сообщение об ошибке @iBug. - person gsamaras; 12.09.2017