이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

eternalbleu의 이미지
1590
points
0
points

#include <stdio.h> 
 
int main() 
{ 
int n; 
printf("Array Size? "); 
scanf("%d", &n); 
int x[n]; 
 
int i; 
for (i = 0; i < n; i++) { 
x[i] = i * 10; 
printf("%d ", x[i]); 
} 
 
printf("\n"); 
return 0; 
} 

gcc 에서 되는 걸로 봐선 표준인거 같기는한데..

VS.net 에서는 왜 이런식으로 배열 할당이 안될까요?

VS.net 은 비표준 컴파일러인가요 ㅡ,ㅡ;;

아니면 혹시 C++ 이라서? ;;

정태영의 이미지
14366
points

아무데서나 변수 선언이 가능한건 c99 부터라고 알고 있습니다 :)

0
points

아무데서나 변수 선언이 가능한건 c99 부터라고 알고 있습니다 :)

gcc 도 3.x 이전까지는 지원하지 않는 부분입니다...

익명 사용자의 이미지

[code:1]int x&#91;n&#93;;[/code:1]이런거

0
points

int x[n]; 이런거 되나요 ?

익명 사용자의 이미지

Re: 이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

0
points

eternalbleu 씀:

int n;
int x[n];
[/code]

C90에서 배열의 크기는 컴파일 시간에 상수여야 합니다. 그리고 gcc에서 된다고 꼭 표준인 것은 아닙니다. GNU Extension이란 것이 있습니다.

Re: 이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

0
points

Anonymous 씀:
eternalbleu 씀:

int n;
int x[n];
[/code]

C90에서 배열의 크기는 컴파일 시간에 상수여야 합니다. 그리고 gcc에서 된다고 꼭 표준인 것은 아닙니다. GNU Extension이란 것이 있습니다.

이 답변 쓴 사람은 rhizome이었습니다. 로그인을 안 하고 글을 올려버렸네요...

Re: 이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

0
points

그리고 C99에서는 variable-length array가 표준에 포함되었습니다. 하지만 gcc는 훨씬 이전부터 variable array를 지원했던 걸로 압니다.

--

엉뚱한 말이 앞에 들어가서 수정했습니다.

hys545의 이미지
7011
points

Re: 이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

0
points

Anonymous 씀:
eternalbleu 씀:

int n;
int x[n];
[/code]

C90에서 배열의 크기는 컴파일 시간에 상수여야 합니다. 그리고 gcc에서 된다고 꼭 표준인 것은 아닙니다. GNU Extension이란 것이 있습니다.


.모든 컴파일러는 표준+확장입니다.
확장을 쓰면 더 편리하나 이식성이 떨어집니다.

Re: 이게 왜 gcc에서는 되고 VS.net에서는 안될까요?

0
points

hys545 씀:

확장을 쓰면 더 편리하나 이식성이 떨어집니다.

예, 물론 그렇습니다.

하지만 variable-length array의 경우 C99에 포함 되었기 때문에 표준입니다. visual c++에서 지원을 아직 안 하는 것 뿐이죠.

추가 정보

0
points

그리고 C99에 관한 짧은 글이 2004년 developerWorks에 실렸습니다. 참고하십시오.

http://www-128.ibm.com/developerworks/linux/library/l-c99.html?ca=dgr-ln...

eternalbleu의 이미지
1590
points

감사합니다.

0
points

-_-;; 이렇게 많은 분들께서...

감사합니다. (__)(^^)

와 새로운거 알았습니다. ^^

0
points

와 새로운거 알았습니다. ^^

씨에의 이미지
13324
points

[quote="htna_"][code:1]int x&#91;n&#93;;

0
points

htna_ 씀:
int x[n];
이런거 되나요 ?

경우에 따라 다릅니다.

C99를 지원하더라도 저 코드가 VLA가 가능한 부분에 포함될 경우에만 허용됩니다.

VLA에 관한 수 많은 글이 올라왔으니 검색해보시기 바랍니다.

...

0
points

int x[n];

요것이 gcc 에서는 되나보군요... 첨 알았다는;;;

그런데 궁금해졌습니다. 저것이 되는 것이 확장기능이라고 하셨는데

동적할당하고의 차이점이 무엇인지요?

동적할당하고 별반차이 없다면 대충 그까이거 저렇게 하고 말지;;

씨에의 이미지
13324
points

Re: ...

0
points

임종규 씀:
int x[n];

요것이 gcc 에서는 되나보군요... 첨 알았다는;;;

그런데 궁금해졌습니다. 저것이 되는 것이 확장기능이라고 하셨는데

동적할당하고의 차이점이 무엇인지요?

동적할당하고 별반차이 없다면 대충 그까이거 저렇게 하고 말지;;

scope가 한정되어 있을 때 C99표준은 VLA를 허용합니다.따라서 block 내부나 function등의 내부에서 사용되는 배열에서는 컴파일 타임에 배열의 수가 정해지지 않아도 됩니다. 어차피 그렇게 만들어진 배열은 프로그램이 수행 중에 메모리에서 배열을 할당하기 때문에 불가능할 이유가 없었던 거죠.

동적할당과의 차이점은 어떤 저장장소(storage)에 할당되느냐와 범용적으로 쓸 수 있느냐 이겠지요.

gcc 옵션

0
points

gcc는 기본적으로 ISO C90 표준 + GNU extensions 모드로 동작하게 되어 있습니다.

만약에 특정 표준에 따라 gcc가 동작하기를 원하신다면 -std 옵션과 -pedantic-errors 옵션을 함께 이용하시면 됩니다. 예를 들어 최근에 나온 C99인 표준으로 동작하기를 원한다면

gcc -std=c99 -pedantic-errors source.c

와 같이 사용하면 되구요. 이전 표준인 C90에 맞춰 동작하기를 원한다면

gcc -std=iso9899:1990 -pedantic-errors source.c

eternalbleu님이 보여주신 코드를 C90 모드로 컴파일하면 아래와 같은 결과가 나옵니다.

$ gcc -std=iso9899:1990 -pedantic-errors that_code.c
vla.c: In function `main':
vla.c:8: error: ISO C90 forbids variable-size array `x'
vla.c:8: error: ISO C89 forbids mixed declarations and code

더 자세한 내용을 알고 싶다면 manual page를 참조하시면 됩니다.

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.