이 방법으로 변수를 선언했습니다.
int i = 0;
경고를받습니다.
ISO C90은 혼합 선언 및 코드를 금지합니다.
어떻게 고칠 수 있습니까?
이 방법으로 변수를 선언했습니다.
int i = 0;
경고를받습니다.
ISO C90은 혼합 선언 및 코드를 금지합니다.
어떻게 고칠 수 있습니까?
-std=c99
) 를 허용하는 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 이상을 지원하는지 확인하십시오. 그렇다면 C89 대신 C99를 컴파일하도록 구성하십시오.
컴파일러 나중에 C99를 지원하지 않거나, 당신도 할 필요가 다른 컴파일러 찾을 것이다 않습니다 를 지원, 또는 모든 선언은 블록 내 모든 문 앞에 와야 있도록 코드를 다시 작성합니다.
컴파일러를 사용 (또는 필요한 인수와 함께 제공)하여 최신 버전의 C 표준, C99 또는 C11 용으로 컴파일하십시오. 예를 들어 GCC 컴파일러 제품군의 경우 -std=c99
.
-std=gnu89
리눅스 커널 모듈을 컴파일 할 때 사용됩니다.
-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
.