ISO C90은 C에서 선언과 코드가 혼재하는 것을 금지합니다.
다음과 같이 변수를 선언했습니다.
int i = 0;
경고 메시지를 받았습니다.
ISO C90에서는 선언과 코드가 혼재하는 것을 금지하고 있습니다.
어떻게 하면 고칠 수 있죠?
변수 선언을 블록의 맨 위로 이동해야 한다고 생각합니다.예.
{
foo();
int i = 0;
bar();
}
로.
{
int i = 0;
foo();
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 이후를 지원하지 않는 경우, C99를 지원하는 다른 컴파일러를 찾거나 모든 선언이 블록 내의 문 앞에 오도록 코드를 다시 써야 합니다.
변수가 블록의 맨 위에 있는지 확인합니다.또한 변수를 컴파일할 경우-ansi-pedantic
, 다음과 같이 되어 있는 것을 확인합니다.
function() {
int i;
i = 0;
someCode();
}
-Wdeclaration-after-statement
최소 재현 가능한 예
메인
#!/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에서 테스트 완료.
컴파일러를 사용하여(또는 컴파일러에 필요한 인수를 제공), C 표준, C99 또는 C11의 최신 버전을 컴파일합니다.예를 들어 GCC 컴파일러 패밀리의 경우-std=c99
.
오류를 유발하는 원인을 진단하기 위해 먼저 제거하려고 합니다.= 0
에러가 트립 되어 있는 경우는, 대부분의 경우, 선언은 코드 다음에 행해집니다.
오류가 없는 경우 C 표준 적용/컴파일 플래그 또는 ...와 관련이 있을 수 있습니다.
어떤 경우에도 현재 스코프의 선두에 변수를 선언합니다.그런 다음 개별적으로 초기화할 수 있습니다.실제로 이 변수가 고유한 범위를 가질 수 있는 경우 {}에서 해당 정의를 구분하십시오.
OP가 맥락을 명확히 할 수 있다면 보다 직접적인 대응이 뒤따를 것이다.
언급URL : https://stackoverflow.com/questions/13291353/iso-c90-forbids-mixed-declarations-and-code-in-c
'programing' 카테고리의 다른 글
VueJ는 프로포트를 데이터 속성 가치로 사용 (0) | 2022.08.30 |
---|---|
Vue.js vue-router:페이지를 새로고침하지 않고 되돌아가려면 어떻게 해야 합니까? (0) | 2022.08.29 |
vue.js cli 명령어 "npm run serve" 작동 방식 (0) | 2022.08.29 |
컴포넌트에 상태가 표시되는 이유는 무엇입니까? (0) | 2022.08.29 |
Vue 라우터 입력 전 vs 각 입력 전 (0) | 2022.08.29 |