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

aNsITAte의 이미지

#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++ 이라서? ;;

정태영의 이미지

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

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

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

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

익명 사용자의 이미지

eternalbleu wrote:

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

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

rhizome의 이미지

Anonymous wrote:
eternalbleu wrote:

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

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

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

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

rhizome의 이미지

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

--

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

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

hys545의 이미지

Anonymous wrote:
eternalbleu wrote:

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

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


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

즐린

rhizome의 이미지

hys545 wrote:

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

예, 물론 그렇습니다.

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

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

rhizome의 이미지

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

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

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

aNsITAte의 이미지

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

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

그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-

BarracuTa의 이미지

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

저희 업소를 방문해 주셔서 감사합니다.

죠커의 이미지

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

경우에 따라 다릅니다.

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

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

임종규의 이미지

int x[n];

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

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

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

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

/* How to Love Others */
while(GetDepth(Love) < Enough) DoLove();

죠커의 이미지

임종규 wrote:
int x[n];

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

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

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

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

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

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

rhizome의 이미지

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를 참조하시면 됩니다.

거짓말이 없다는 것은 현대성보다도 사상보다도
백배나 더 중요한 일이다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.