이 에러는 어떻게 잡죠??

comguy2k의 이미지

#include <stdio.h>
struct a{
int x;
};
main(void)
{
int num;
num=0;
struct a b;
}

==>결과
[comguy2k@181s xyz]$ gcc -o b a.c
a.c: In function `main':
a.c:9: parse error before `struct'

파서에러가 나는데 그 정확한 이유를 설명해주시면 감사하겠습니다. 고수분님들..

appkr의 이미지

comguy2k wrote:
#include <stdio.h>
struct a{
int x;
};
main(void)
{
int num;
num=0;
struct a b;
}

==>결과
[comguy2k@181s xyz]$ gcc -o b a.c
a.c: In function `main':
a.c:9: parse error before `struct'

파서에러가 나는데 그 정확한 이유를 설명해주시면 감사하겠습니다. 고수분님들..


C에서는 변수 선언이 항상 앞에 있어야 합니다. 위에서 보면 b를 선언하기전에 num=0;이라는 문장이 있어서 그럽니다.
num=0하고 struct a b;의 위치를 바꿔주세요
ㅡ,.ㅡ;;의 이미지

어디서 대충한번보고 걍 생각나는데로 적어본 코드인가요?

선언중간에 작업(?) 도 들어가고..

스트럭쳐 선언방법은 몇가지 스타일이 있으니.. 책이나 예제를 보면서
따라해보세요..


----------------------------------------------------------------------------

charsyam의 이미지

comguy2k wrote:
#include <stdio.h>
struct a{
int x;
};
main(void)
{
int num;
num=0;
struct a b;
}

==>결과
[comguy2k@181s xyz]$ gcc -o b a.c
a.c: In function `main':
a.c:9: parse error before `struct'

파서에러가 나는데 그 정확한 이유를 설명해주시면 감사하겠습니다. 고수분님들..

c 언어의 경우 선언부가 블록( {} ) 의 앞부분에만 존재 할 수 있습니다.

그러니 중간에 num = 0; 이 struct a b 보다 앞에 두면 안됩니다.

=========================
CharSyam ^^ --- 고운 하루
=========================

맹고이의 이미지

Quote:
<madang/STD/gon1982>14% cat a.c
#include <stdio.h>
struct a {
int x;
};
main(void) {
int num;
num = 0;
struct a b;
}

<madang/STD/gon1982>15% cc -o b a.c
<madang/STD/gon1982>16%


엇 저는 잘되네요;;
c 에서도 중간에 변수선언이 가능하게 됐다는 예길
어디서 읽었는데.. 잘못해석한건가;;
eminency의 이미지

제가 알기로 gcc에서는 버전 3.x에서부턴가 중간에 변수 선언이 가능하더군요...

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

godyang의 이미지

안녕하세요?

중간에서 변수 사용할 수 있는건 C표준(ANSI인지 POSIX인지 가물가물)에선 안되는 걸로 알고 있습니다.

하지만 요즘 컴파일러들이 똑똑하고... C++에선 중간 변수 선언을 허용하기 때문에 오히려 초보자들에게 오해를 야기할 수 있습니다.

가능하면 C프로그램을 만드실 때는 변수 선언은 항상 앞에다 하세요.

pynoos의 이미지

C99 에서 정의한 것이고 gcc 3.x 에서 C99을 수용하기 때문에 그럴것입니다.

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

에서

mixed declarations and code

항을 보세요.

C99은 만들어진지 4년밖에 안되었기 때문에 많은 compiler가 지원하고 있지 않습니다. 대부분은 C89 수준이지요.

언젠가는... C99가 모든 compiler에 구현이 될 때는 위와 같은 논의가 없어지겠지요.

과거 K&R 만 지원하는 compiler가 많을 때는 ansi 로만 작성하면 안된다는 말도 있었으니까요.

사족입니다만, C99 이 C++ 98 이후에 결정된 것 때문에 더이상 C가 C++의 subset이 아니라는 논의가 활발한 적이 있었습니다.
사실 C99 안에는 라이브러리가 아닌 컴파일러 수준에서 허수 키워드를 지원하는 것등 몇가지 차이가 있습니다.

http://std.dkuug.dk/JTC1/SC22/WG14/

dummy999의 이미지

파서에러라는것은.....
원래 코딩을 하게되면. 컴파일러는 코드라인대로 줄을 해석합니다.
다시말해

int a;

라고써지면 이것을 의미있는단어끼리 나누게되는데 이것을 Lexical Step이라고 하죠.
이문장을 의미있는단어로 나누면

int
a
;
이렇게 의미있는 문장으로 나눠집니다.

이것이 나중에는 어순검사를 하게되는데 그것이 Pasher Step이되죠..
파서라는것은 이문장이 어순에 맞게 트리구조로 구성되죠..
이단계에서
문장은 어떤 순서를 가지게 하죠.

영어보면 몇형식은 주어 + 동사 이런식으로 쓰게하는것처럼.. 이것도 그런게 되죠.
그런데 이런경우 작업하나를 구분짓는데 이경우

#include <stdio.h>
struct a
{
int x;
};

main(void)
{
int num;
num=0;
struct a b;
}

num =0; 이라는 문장이 씌여짐과 동시에 Ansi C표준에의해 더이상 선언문이 들어가지않는것으로
간주해버립니다. 만약 선언문이 이후에 들어가면 에러를 뜨게 하는게되버립니다.
항상 { } 괄호사이에는 선언문 그다음 변수사용구문이 들어가는게 코드의 순서가 되버린거죠

요즘은 이것을 모두 해결해주는 컴파일러들이 등장도 하죠..
그러나 실질적으로 이런파싱단계는 상당히 구현하기 힘들기도합니다.

우리가 C언어하면서 GOTO쓰지말라고하는것도 이걸쓰면 파싱할때 오류가 발생할수있기때문에
하지말라는거죠,

될수있으면 선언문쓰고난 다음에 구문쓰시는 습관을 들이도록하시는게 좋을듯.
(사실 저도 어디서 얻어들은 이야기라서 맞는지 몰겠습니다.)

------------------------------------
F/OSS bless you... ^^*

partout의 이미지

Quote:
우리가 C언어하면서 GOTO쓰지말라고하는것도 이걸쓰면 파싱할때 오류가 발생할수있기때문에
하지말라는거죠,

goto문 사용을 자제하라는 것은 구조적 프로그래밍의 개념에 위배되기
때문인 걸로 알고 있습니다.

하지만, 에러 처리 루틴 등에서 goto문은 아주 유용하게 사용됩니다.
실제로 리눅스 커널 코드를 보다보면 의외로 goto문을 사용한 코드가 많습니다.

어찌나 졸린지..~~

lived의 이미지

와...처음 답변 달아 보네요 +_+ 여기 좋은 글들도 많고...

goto는 쓰는 사람이야 편하지만...프로그램을 읽기 힘들게 만들고

나중에 디버깅이나 그런게 하기 힘들다죠...

하지만 아주 잘쓴다면..정형화 해서...좋다고 들은거 같습니다.

커널 개발자들이 잘 쓴다고 합니다...

댓글 달기

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