Я хотел бы, чтобы кто-нибудь знал, как заставить gcc завершиться неудачей текущей компиляции, если переменная не объявлена в верхней части функции.
void foo() {
int bar; //Enabled
/* some code stuff */
int bar2; //Compile Error
}
Я уже видел, что мне нужно скомпилировать с -pedantic
&& -ansi
.
Это уже относится к моему проекту, но, похоже, не работает.
Кстати, я компилирую в C89
, и мне действительно нужно оставаться в этой версии C. (-ansi
)
Во всех документах, которые я видел, нет флага gcc, позволяющего это сделать. Я что-то пропустил.
Я сделал ошибку в версии C, отредактировал
Может флаг -std=c90
Часто -pedantic-errors
требуется, чтобы заставить gcc выдавать предупреждение в дополнение к -std
(и -Wall -Wextra
). Но вы можете использовать специальный переключатель -Wdeclaration-after-statement
, который выдает этот конкретный случай. При этом вы получите это предупреждение независимо от любых других переключателей, которые вы могли или не могли использовать. Например, gcc -std=c11 -Wdeclaration-after-statement file.c
выдаст предупреждение, даже если «смешанные объявления» вполне допустимы в C11.
-pedantic
будет выдавать диагностика только для случаев, для которых выдан стандартный требует. Это только предупреждение. Предположительно у вас будет желаемое поведение с -pedantic-errors
в сочетании с -ansi
-std=c90
;)
Пример:
#include <stdio.h>
int main(void) {
printf("Hello Stack Overflow\n");
int fail;
}
А потом:
% gcc test.c -ansi -pedantic
test.c: In function ‘main’:
test.c:4:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
int fail;
^~~
% ./a.out
Hello Stack Overflow
но с -pedantic-errors
:
% gcc test.c -ansi -pedantic-errors
test.c: In function ‘main’:
test.c:4:3: error: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
int fail;
^~~
% ./a.out
bash: ./a.out: No such file or directory
Версия
% gcc --version
gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Обратите внимание, что даже ISO C90 не требует, чтобы объявления были в верхней части функция - подойдет начало любого составное заявление.
Есть возможность предупреждать о переменных, определенных или объявленных после операторов:
-Wdeclaration-after-statement
- предупреждение, если вы также не установили -Werror
(и рекомендуется всегда использовать -Werror
; вы не забудете исправить предупреждения!)-Werror=declaration-after-statement
- ошибка, даже если вы не установили -Werror
Это заставляет переменные определяться в верхней части любого блока операторов (как того требует C90), а не позволяет объявлять переменные, когда это необходимо (как это разрешено C99 и более поздними версиями). Это запрещает:
int function(int x)
{
int y = x + 2;
printf("x = %d, y = %d\n", x, y);
int z = y % x; // Disallowed by -Wdeclaration-after-statement
printf("z = %d\n", z);
return x + y + z;
}
Я не знаю ни одной опции, которая предотвращала бы объявление переменных после {
внутреннего блока в функции.
флаг компиляции
-ansi
делает его C89.