[C Lang] 변수의 선언 위치에 관한 질문

line123의 이미지

프로그래밍 공부를 해보려고 이런 코드를 짜봤는데요...

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 int
      5 main(int argc, char *argv[])
      6 {
      7         if (argc != 2)
      8         {
      9                 printf("argument error\n");
     10                 exit(1);
     11         }
     12 
     13         int b;
     14 
     15         b = atoi(argv[1]);
     16         printf("your input : %d\n", b);
     17 
     18         return 0;
     19 }

Quote:
localhost:~$ gcc -Wall temp.c
temp.c: In function `main':
temp.c:13: parse error before `int'
temp.c:15: `b' undeclared (first use in this function)
temp.c:15: (Each undeclared identifier is reported only once
temp.c:15: for each function it appears in.)

13번째 줄의 int b; 를 if 문 위로 위치시키면 에러가 안납니다.

왜 이런건지 좀 가르쳐 주시겠습니까?

이런 사소한 기초 문법이 있는 문서도 알려주시면 감사하겠습니다.

morison77의 이미지

아주 예전엔 C언어에서 변수 선언을 먼저 전부 해주고 나서
본 프로그램을 짜야만 했던 시절이 있긴 한데..
정확히 언제인지는 모르겠지만 C 표준이 바껴서 변수 선언의 위치가
편해진걸로 알고 있는데.. 그 문제 아닌가 싶습니다..
오래된 컴파일러에서는 그런 문제가 보일껍니다..
허접한 답변이였지만 여튼 도움이 되셨으면 하네요.

p.s 저는 버릇때문에 여전히 변수선언을 전부 해줘버리는데..
그게 아직은 좋은듯합니다. 가끔 오래된 시스템을 만나기도 하거든요 :D

light my fire

someddorai의 이미지

안녕하세요.. 질문만 할줄 알았던 제가 답변까지;;

보통 변수의 선언은..

함수의 초반에 해주죠..

지금 코드 처럼 int b; 를 중간에 넣어주면..

오류가 나지요 그이유는..

컴파일러의 동작과정에 있다고 생각하는데요..

컴파일러는 먼저.. 함수와 변수의 선언된 곳을

처리하고..

이런 이런 함수 와 변수가 있다고 생각하고 컴파일을 한다고 알고 있습니다.

그런데 중간에 갑자기 새로운 변수를 선언하니.. 컴파일러는 이건 뭐지? 하면서 오류를.. 낸다고 합니다 (-_-);

컴파일러는 단순하거든요..;;

허접한 답변... 고수님들이 보충해주실듯 ㅜㅜ;

Linux 해안가에서.. 모래알 줍는중.. 언제다 주워?

lsj0713의 이미지

예전의 C언어에서는 선언문이 반드시 함수의 처음(혹은 블럭의 처음)에 위치해야 했습니다. 그러나 C99(99년도에 제정된 C 표준)에서부터는 아무 곳에서나 선언 가능한걸로 바뀌었습니다(...정확히 어떻게 바뀌었는지는 모르겠지만). 그러나 현존하는 모든 컴파일러가 C99를 지원하는 것은 아니고, C99를 지원하는 컴파일러들조차도 모든 특징을 완벽하게 지원하는 것은 아니므로 확인 후에 사용하는 것이 좋습니다.

ctojang의 이미지

JAVA나 C++ 에서는 변수 선언이

필요한 곳에서 이루어 질 수 있지만,

C 언어는 그렇지 않습니다.

왠만하면 함수의 시작부분에 하셔야 합니다. :)

line123의 이미지

답변 감사합니다.

컴파일러 언급을 하셔서...

Quote:
localhost:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.4/specs
gcc version 2.95.4 20011002 (Debian prerelease)

제가 사용한 컴파일러에서는 "아무데서나 선언하기"가 지원이 안되나 봅니다 ...^^;

C99... 참고해봐야 겠군요...

정태영의 이미지

line123 wrote:
답변 감사합니다.

컴파일러 언급을 하셔서...

Quote:
localhost:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.4/specs
gcc version 2.95.4 20011002 (Debian prerelease)

제가 사용한 컴파일러에서는 "아무데서나 선언하기"가 지원이 안되나 봅니다 ...^^;

C99... 참고해봐야 겠군요...

예 gcc 3.x에서부터 지원합니다 :)

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

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

line123의 이미지

Quote:
localhost:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs
Thread model: posix
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

위의 컴파일러를 가진 시스템에서 동일한 코드로 시도했더니 정말 되는군요!

참 신기할 따름입니다. :- D

답변 주신 분들 모두 감사합니다~!

댓글 달기

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