"C99 모드 외부에서 사용 된 for 루프 초기 선언"GCC 오류를 수정하려면 어떻게해야합니까?


116

내가 해결하기 위해 노력하고있어 3N + 1 문제 와 나는이 for루프를 그 다음과 같다 :

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

불행히도 GCC로 컴파일하려고 할 때이 오류가 발생합니다.

3np1.c : 15 : 오류 : 'for'루프 초기 선언이 C99 모드 외부에서 사용됨

C99 모드가 무엇인지 모르겠습니다. 어떤 아이디어?

답변:


148

i루프 밖에서 선언하려고합니다 !

3n + 1 해결에 행운을 빕니다 :-)

예를 들면 다음과 같습니다.

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

여기 에서 C의 for 루프에 대해 자세히 알아 보세요 .


그렇다면 대신 while 루프를 사용하지 않는 이유는 무엇입니까?
Erik W

3
@ErikW 귀하의 질문이 매우 나쁩니다
user25

118

C99 모드 를 활성화하는 컴파일러 스위치가 있는데 , 무엇보다도 for 루프 내에서 변수를 선언 할 수 있습니다. 켜려면 컴파일러 스위치를 사용하십시오.-std=c99

또는 @OysterD가 말했듯이 루프 외부에서 변수를 선언하십시오.


7
실제로 -std = gnu99는 여전히 gcc 확장을 사용하기 때문에 더 바람직 할 것입니다 (gcc의 기본값은 -std = gnu89이지만 다음 몇 버전에서는 어느 시점에서 gnu99로 변경 될 것입니다)
Spudd86

3
Spudd86 @ : 여부 당신이 원하는 당신이 무슨 일을하는지에 따라 달라집니다 GCC 확장을 가능하게 할 수 있습니다. gcc 이외의 컴파일러에 이식 가능한 코드를 작성하는 것이 목표 인 경우 비활성화하는 것이 유용합니다.
Keith Thompson

21

CodeBlocks 에서 C99 모드로 전환하려면 다음 단계를 따르십시오.

클릭 프로젝트 / 빌드 옵션 다음 탭에서 컴파일러 설정 하위 탭을 선택 기타 옵션을 , 장소를 -std=c99텍스트 영역에서 클릭 확인 .

그러면 컴파일러에 대해 C99 모드 가 켜 집니다.

누군가를 도울 수 있기를 바랍니다!


이것은 기타 컴파일러 옵션 의 코드 블록 16.1에서 도움이되었습니다 ! -std=gnu99위의 일부 답변에 묘사 된대로 사용했지만 !
Ankur Shah

그러나 이것은 일시적으로 도움이되었습니다! 코드를 컴파일 할 때마다이 작업을 수행해야합니다! ... :(
Ankur Shah

아니, 당신은하지 않았습니다! 이 작업은 각 새 프로젝트에 대해 한 번만 수행해야합니다.
akelec

14

이 오류도 발생했습니다.

for (int i=0;i<10;i++) { ..

C89 / C90 표준에서는 유효하지 않습니다. OysterD가 말했듯이 다음을 수행해야합니다.

int i;
for (i=0;i<10;i++) { ..

원래 코드는 C99 및 C 언어의 이후 표준에서 허용됩니다.


3
gcc의 경우 "-std = c99"를 던집니다. 추가 기능은 Imran의 답변을 참조하십시오.
Matt J

예, 유효한 C입니다. 유효한 C89 / C90이 아닙니다.
Keith Thompson

@KeithThompson : 명확 해졌습니다.
Blorgbeard는 2013

당신은 여전히 ​​유효한 C가 아니라고 말하고 있습니다. 그것은이다 완벽하게 유효한 C; 1999 표준은 1990 표준을 대체하고 대체했으며 2011 표준은 1999 표준을 대체하고 대체했습니다 (이 답변을 처음 게시했을 때 후자는 존재하지 않았지만).
Keith Thompson

@KeithThompson 글쎄, 그건 내가 말하고 있다고 생각한 것이 아닙니다. "C89 / C90 표준에서 유효하지 않음"이 맞다고 생각하십니까?
Blorgbeard는 2013

13

@Blorgbeard :

C99의 새로운 기능

  • 인라인 함수
  • 변수 선언은 더 이상 파일 범위 또는 복합 명령문의 시작으로 제한되지 않습니다.
  • long long int, 선택적 확장 정수 유형, 명시 적 부울 데이터 유형 및 복소수를 나타내는 복합 유형을 포함한 몇 가지 새로운 데이터 유형
  • 가변 길이 배열
  • BCPL 또는 C ++에서와 같이 //로 시작하는 한 줄 주석 지원
  • snprintf와 같은 새로운 라이브러리 함수
  • stdbool.h 및 inttypes.h와 같은 새 헤더 파일
  • 유형 일반 수학 함수 (tgmath.h)
  • IEEE 부동 소수점에 대한 향상된 지원
  • 지정된 이니셜 라이저
  • 복합 리터럴
  • 가변 매크로 지원 (가변 매크로 매크로)
  • 보다 적극적인 코드 최적화를 허용하도록 제한 제한

http://en.wikipedia.org/wiki/C99

C99 둘러보기



3

Make 와 같은 자동화 된 빌드 유틸리티를 사용하는 외부 소스에서 코드를 컴파일하려는 경우 명시적인 gcc 컴파일 호출을 추적 할 필요가 없도록 환경 변수를 설정할 수 있습니다. 명령 프롬프트에 입력하거나 .bashrc (또는 Mac의 경우 .bash_profile)를 입력합니다.

export CFLAGS="-std=c99"

C ++ 11이 필요한 C ++ 컴파일로 유사한 시나리오를 실행하는 경우 유사한 솔루션이 적용됩니다. 다음을 사용할 수 있습니다.

export CXXFLAGS="-std=c++11"

1

나는 같은 문제가 있었고 i루프 외부 를 선언하면 작동합니다 .

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

Jihene Stambouli가 OP 질문에 가장 직접적으로 답변했습니다. 질문은 다음과 같습니다. 왜

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

오류를 생성합니다.

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

대답은

for(int i = low...

해야한다

int i;
for (i=low...

1

Code :: Blocks 16.01에서 C99 모드 활성화

  • 설정 -> 컴파일러 ...로 이동합니다 .
  • 에서 컴파일러 플래그 의 섹션 컴파일러 설정 탭을 선택 확인란 ' 유무는 1999 년 ISO C 언어 표준에 따라 GCC [-std = C99] '

0

Qt-creator의 경우 : * .pro 파일에 다음 줄을 추가하십시오 ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.