C배열선언에 대해서 궁금한 점이 있습니다..

rapzzard의 이미지

현재 어떤 간단한 프로그램을 짰는데 그중 일부를 발췌하자면

const int SIZE = 10;

int
main(int argc, char argv[])
{
    char lines[SIZE];
    ...
    return 0;
}

위와같은데요..이게 gcc에서는 컴파일이 됩니다..
그런데 VC++ 6.0에서는 배열사이즈가 0이라고 되지 않더군요..
그리고 BCB에서는 상수를 써야한다고 한다고 불평하더라구요..
그런데 어차피 const expression이 오면 될꺼같은데요..
그렇게 되면 어차피 SIZE라는 변수자체도 컴파일시간에서 값이 결정되기때문에..상관이 없을것같은데..그렇다면 위의 다른 두 컴파일러들이 표준을 지키지 않는 걸까요.아니면..gcc의 확장기능인가요?
C의 표준이 아니더라도 여러 C++책들(Effective C++이나 C Primer Plus같은)에서는 이런식의 표현이 가능하다라는 식으로 나와있는것같은데 잘 모르겠습니다..;;
도대체 어떤 것이 정상적인 걸까요?

P.S : 혹시 VC++ 7.0에서 C컴파일하는방법 아시는분계시면 알려주세요..XD
C파일을 불러도 어딜봐도..빌드메뉴가 안보입니다..;;

불량청년의 이미지

배열의 크기에 define된 상수를 사용하는것은 비표준으로 알고 있습니다.

그러나, 요즘 gcc 상위 버젼에선 이것을 지원하더군요.

아마 vc의 cl 컴파일러가 이 확장을 지원하지 않는것 같습니다.

=====================================

표준이였군요. 오~ 호~

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

버려진의 이미지

c99표준입니다.

lutanist의 이미지

const int SIZE = 10;

int
main(int argc, char argv[])
{
    char lines[SIZE];
    ...
    return 0;
}

위의 코드는 C99 표준입니다. 아마 이름이 가변배열이던가 그럴겁니다.
위 형태의 예를들면

int main(int argc, char **argv[])
{
    char buf[atoi(argv[1])];
    ....
}

(참 나쁜 코드군요... :evil: )
문제는 컴파일러마다 C99년 표준에 대한 지원 정도가 다르다는 겁니다.
아마 gcc도 아직 C99년 표준을 완벽히 지원하지는 않는걸로 알고 있습니다.
아마도 가변배열에 대해서 VC가 아직 지원을 안하는듯 하네요. 다르게 구현
하셔야할 듯...

Quote:

P.S : 혹시 VC++ 7.0에서 C컴파일하는방법 아시는분계시면 알려주세요..XD
C파일을 불러도 어딜봐도..빌드메뉴가 안보입니다..;;

VC++ 7을 안써봐서 잘 모르겠습니다. :)

rapzzard의 이미지

가변길이라고 하셨는데..
사실 const키워드를 붙이면 이미 변할수없는 상수값이 되는것 아닌가요?
제가 const키워드를 잘못 이해하는 건지;;
C99에 가변길이의 배열은 저도 들었습니다만..
그것은 const는 예외인줄 알고 있었거든요..^^;;
그리고 발견한것이..
확장자를 cpp로 고치면 에러를 내뿜지 않는군요;;
아마 VC++이 extension을 이용해서..따로 처리하나봅니다..
답변해주셔서 감사합니다..(__)

죠커의 이미지

rapzzard wrote:

사실 const키워드를 붙이면 이미 변할수없는 상수값이 되는것 아닌가요?
제가 const키워드를 잘못 이해하는 건지;;

제가 알기로는 const 키워드는 상수를 보장하지 않습니다.

const int i;
int j, k, l;
k = i;
l = j;

여기에서 l 에 j값이 대입되듯 똑같은 구현으로 i값이 k에 들어갈수도 있다고 알고 있습니다. 아예 상수로 취급해서 코드를 최적화시키는 것은 최적화의 하나라고 합니다.

PS: 그러고 보니 inline 이라는 키워드도 inline method를 보장하지 않네요.
PS2: gcc도 C99을 지원못한다고 들었는데 그냥 확장일겁니다. c언어에서 //를 지원하는 컴파일러들이 C99을 지원하는 것은 아닌것 처럼[/code]

monpetit의 이미지

lutanist wrote:
문제는 컴파일러마다 C99년 표준에 대한 지원 정도가 다르다는 겁니다.
아마 gcc도 아직 C99년 표준을 완벽히 지원하지는 않는걸로 알고 있습니다.
아마도 가변배열에 대해서 VC가 아직 지원을 안하는듯 하네요. 다르게 구현
하셔야할 듯...

Quote:

P.S : 혹시 VC++ 7.0에서 C컴파일하는방법 아시는분계시면 알려주세요..XD
C파일을 불러도 어딜봐도..빌드메뉴가 안보입니다..;;

VC++ 7을 안써봐서 잘 모르겠습니다. :)


VC++ 7.1도 배열의 첨자는 반드시 상수식이어야만 합니다. 꼭 이와같이 해야만 한다면 컴파일 옵션을 /TP로 주어 C++로 컴파일할 수밖에 없겠죠.
lutanist의 이미지

http://gcc.gnu.org/gcc-3.3/c99status.html

gcc의 c99 지원상태입니다. 참고하세요. :P

ssehoony의 이미지

const 키워드 자체는 c++ 에서 추가 된거니깐
사실 gcc 에서 지원이 안되는게 맞을거에요.
그런데 gcc에서 되는건 c99 에 있어서 gcc 가 c99 의 기능을 어느정도
수렴했기 때문에 그런게 아닐까 하는 생각을 해봅니다.

const 를 이용한 배열 선언은 c++ 에서는거라
혹시 vc 로 컴팔 하셨다면 안되는게 당연할거고 신택스에러가 날 것 같은데
0으로 잡힌다는건 의외네요.

vc++ 로 컴파일 해보세요.
(vc++ IDE에는 c컴팔러과 c++컴팔러 둘다 있다고 하는 것을 들었거든요. 잘은 모르겠습니다.)

c++ 에서 define 보다 const 를 사용하는 걸 권장하는 걸로 알고 있습니다.
그래서 const 로 생성하는 배열도 생성되야 한다고 봅니다.

vc++ 6.0 은 버그가 좀 많이 있죠. 템플릿 지원도 약하고요
혹시 서비스팩이나 기타 패치를 하시지 않으셨다면 패치 해보시고 한번
테스트를 해보세요.

rapzzard의 이미지

Quote:

const 키워드 자체는 c++ 에서 추가 된거니깐
사실 gcc 에서 지원이 안되는게 맞을거에요.
그런데 gcc에서 되는건 c99 에 있어서 gcc 가 c99 의 기능을 어느정도
수렴했기 때문에 그런게 아닐까 하는 생각을 해봅니다.

이것은 잘못된 사실같습니다..
원래 cv-qualifier가 C++에 있었던 것은 사실이지만
ISO/IEC 9899:1990에서 새로 도입되었습니다..
그렇기때문에 C90을 따르는 모든 컴파일러에서는 당연히 cv-qualifier를 쓰는것은 옳은 표현입니다.
정말 이해가 안되는건 왜 C++에서 cv-qualifier를 빌려왔으면서..
배열에서는 왜 사이즈로 쓰면 가변길이 배열이라고 불평을 하는지원..-_-;;
어째튼 확장자를 cpp로 바꿔서 컴파일함으로서..해결은 봤습니다..-_-;;
죠커의 이미지

rapzzard wrote:
정말 이해가 안되는건 왜 C++에서 cv-qualifier를 빌려왔으면서..
배열에서는 왜 사이즈로 쓰면 가변길이 배열이라고 불평을 하는지원..-_-;;
어째튼 확장자를 cpp로 바꿔서 컴파일함으로서..해결은 봤습니다..-_-;;

C와 C++는 의도적으로 다르게 표준을 만든다고 들었습니다. C++에서 받아들이는 부분들도 있지만 C언어에 필요한지를 생각해본다고 하던데요 :-)

전웅의 이미지

rapzzard wrote:
이것은 잘못된 사실같습니다..
원래 cv-qualifier가 C++에 있었던 것은 사실이지만
ISO/IEC 9899:1990에서 새로 도입되었습니다..
그렇기때문에 C90을 따르는 모든 컴파일러에서는 당연히 cv-qualifier를 쓰는것은 옳은 표현입니다.

맞습니다.

rapzzard wrote:
정말 이해가 안되는건 왜 C++에서 cv-qualifier를 빌려왔으면서..
배열에서는 왜 사이즈로 쓰면 가변길이 배열이라고 불평을 하는지원..-_-;;

언어의 형식적 정의를 훼손할 수 없기 때문입니다. 상수 수식 (constant
expression), 좌변값 (lvalue) 등의 정의가 C++ 과 다르기 때문에 const 로
한정된 대상체의 값을 상수 수식에서 허락할 수 없습니다.

그리고, const, volatile 의 문법적 특성과 의미는 C++ 에서 빌렸지만,
세부적인 규칙은 다른 개념을 사용해 접근하기 때문에 C++ 과 다릅니다.

void func(const int a[10][10])
{
}

int main(void)
{
    int a[10][10];
    
    func(a);    /* invalid in C, but valid in C++ */

    return 0;
}

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.