Я оголосив змінну таким чином:
int i = 0;
Я отримую попередження:
ISO C90 забороняє змішані декларації та коди
Як я можу це виправити?
Я оголосив змінну таким чином:
int i = 0;
Я отримую попередження:
ISO C90 забороняє змішані декларації та коди
Як я можу це виправити?
-std=c99
).
Відповіді:
Я думаю, вам слід перемістити оголошення змінної до верхньої частини блоку. Тобто
{
foo();
int i = 0;
bar();
}
до
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
Аж до стандарту C99 усі декларації повинні бути перед будь-якими операторами в блоці:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99 дозволено змішувати декларації та твердження (наприклад, C ++). Багато компілятори по- , як і раніше по замовчуванням C89, і деякі компілятори (наприклад, від Microsoft) не підтримують C99 взагалі .
Отже, вам потрібно буде зробити наступне:
Визначте, чи підтримує ваш компілятор C99 або пізнішої версії; якщо це так, налаштуйте його таким чином, щоб він компілював C99 замість C89;
Якщо ваш компілятор не підтримує C99 або пізнішої версії, вам потрібно буде або знайти інший компілятор, який його підтримує, або переписати свій код, щоб усі декларації стояли перед будь-якими операторами в блоці.
Просто використовуйте компілятор (або надайте йому необхідні аргументи) таким чином, щоб він компілювався для останньої версії стандарту C, C99 або C11. Наприклад, для сімейства компіляторів GCC, яке це було б -std=c99
.
-std=gnu89
використовується під час компіляції модулів ядра Linux.
Переконайтесь, що змінна знаходиться у верхній частині блоку, і у випадку, якщо ви її скомпілюєте -ansi-pedantic
, переконайтеся, що вона виглядає так:
function() {
int i;
i = 0;
someCode();
}
Щоб діагностувати, що насправді викликає помилку, спершу спробую видалити = 0
Якщо помилка спрацьовує, то, швидше за все, оголошення йде після коду.
Якщо помилки немає, то це може бути пов’язано із прапорами забезпечення / компіляції стандарту C АБО ... чимось іншим.
У будь-якому випадку оголосіть змінну на початку поточної області дії. Потім ви можете ініціалізувати його окремо. Дійсно, якщо ця змінна заслуговує на власний обсяг - розмежуйте її визначення в {}.
Якби ОП могла пояснити контекст, то слідувала б більш спрямована відповідь.
-Wdeclaration-after-statement
мінімально відтворюваний приклад
main.c
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
Попередження:
gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
gcc -std=c89 -pedantic -Werror main.c
Не попереджайте:
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
Попередження:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
Перевірено на Ubuntu 16.04, GCC 6.4.0.
-pedantic
або-std=c89
, і в цьому випадку ви можете скомпілювати,-std=gnu99
якщо хочете.