Nice programing

ISO C90은 C에서 혼합 된 선언과 코드를 금지합니다.

nicepro 2020. 11. 10. 22:17
반응형

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 를 전혀 지원하지 않습니다 .

따라서 다음을 수행해야합니다.

  1. 컴파일러가 C99 이상을 지원하는지 확인하십시오. 그렇다면 C89 대신 C99를 컴파일하도록 구성하십시오.

  2. 컴파일러 나중에 C99를 지원하지 않거나, 당신도 할 필요가 다른 컴파일러 찾을 것이다 않습니다 를 지원, 또는 모든 선언은 블록 내 모든 문 앞에 와야 있도록 코드를 다시 작성합니다.


컴파일러를 사용 (또는 필요한 인수와 함께 제공)하여 최신 버전의 C 표준, C99 또는 C11 용으로 컴파일하십시오. 예를 들어 GCC 컴파일러 제품군의 경우 -std=c99.


변수가 블록의 맨 위에 있는지 확인하고로 컴파일하는 경우 다음과 -ansi-pedantic같은지 확인하십시오.

function() {
    int i;
    i = 0;

    someCode();
}

실제로 오류를 유발하는 원인을 진단하기 위해 먼저 = 0

  • 오류가 발생하면 선언이 코드 다음에 올 가능성이 큽니다.

  • 오류가 없으면 C 표준 시행 / 컴파일 플래그 또는 다른 것과 관련이있을 수 있습니다.

In any case, declare the variable in the beginning of the current scope. You may then initialize it separately. Indeed, if this variable deserves its own scope - delimit its definition in {}.

If the OP could clarify the context, then a more directed response would follow.


-Wdeclaration-after-statement minimal reproducible example

#!/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

# Give warning.
! 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

# Don't give warning.
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

The warning:

main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int a = 1;
     ^~~

Tested on Ubuntu 16.04, GCC 6.4.0.

참고URL : https://stackoverflow.com/questions/13291353/iso-c90-forbids-mixed-declarations-and-code-in-c

반응형