#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'
파서에러가 나는데 그 정확한 이유를 설명해주시면 감사하겠습니다. 고수분님들..
#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 ^^ --- 고운 하루 =========================
<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%
<madang/STD/gon1982>15% cc -o b a.c <madang/STD/gon1982>16%
제가 알기로 gcc에서는 버전 3.x에서부턴가 중간에 변수 선언이 가능하더군요...
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
안녕하세요?
중간에서 변수 사용할 수 있는건 C표준(ANSI인지 POSIX인지 가물가물)에선 안되는 걸로 알고 있습니다.
하지만 요즘 컴파일러들이 똑똑하고... C++에선 중간 변수 선언을 허용하기 때문에 오히려 초보자들에게 오해를 야기할 수 있습니다.
가능하면 C프로그램을 만드실 때는 변수 선언은 항상 앞에다 하세요.
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/
---http://coolengineer.com
파서에러라는것은..... 원래 코딩을 하게되면. 컴파일러는 코드라인대로 줄을 해석합니다. 다시말해
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... ^^*
goto문 사용을 자제하라는 것은 구조적 프로그래밍의 개념에 위배되기 때문인 걸로 알고 있습니다.
하지만, 에러 처리 루틴 등에서 goto문은 아주 유용하게 사용됩니다. 실제로 리눅스 커널 코드를 보다보면 의외로 goto문을 사용한 코드가 많습니다.
어찌나 졸린지..~~
와...처음 답변 달아 보네요 +_+ 여기 좋은 글들도 많고...
goto는 쓰는 사람이야 편하지만...프로그램을 읽기 힘들게 만들고
나중에 디버깅이나 그런게 하기 힘들다죠...
하지만 아주 잘쓴다면..정형화 해서...좋다고 들은거 같습니다.
커널 개발자들이 잘 쓴다고 합니다...
텍스트 포맷에 대한 자세한 정보
<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]
Re: 이 에러는 어떻게 잡죠??
C에서는 변수 선언이 항상 앞에 있어야 합니다. 위에서 보면 b를 선언하기전에 num=0;이라는 문장이 있어서 그럽니다.
num=0하고 struct a b;의 위치를 바꿔주세요
어디서 대충한번보고 걍 생각나는데로 적어본 코드인가요?선언중간
어디서 대충한번보고 걍 생각나는데로 적어본 코드인가요?
선언중간에 작업(?) 도 들어가고..
스트럭쳐 선언방법은 몇가지 스타일이 있으니.. 책이나 예제를 보면서
따라해보세요..
----------------------------------------------------------------------------
Re: 이 에러는 어떻게 잡죠??
c 언어의 경우 선언부가 블록( {} ) 의 앞부분에만 존재 할 수 있습니다.
그러니 중간에 num = 0; 이 struct a b 보다 앞에 두면 안됩니다.
=========================
CharSyam ^^ --- 고운 하루
=========================
[quote]<madang/STD/gon1982>14% cat
엇 저는 잘되네요;;
c 에서도 중간에 변수선언이 가능하게 됐다는 예길
어디서 읽었는데.. 잘못해석한건가;;
제가 알기로 gcc에서는 버전 3.x에서부턴가 중간에 변수 선언이 가능하
제가 알기로 gcc에서는 버전 3.x에서부턴가 중간에 변수 선언이 가능하더군요...
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
안녕하세요?중간에서 변수 사용할 수 있는건 C표준(ANSI인지 P
안녕하세요?
중간에서 변수 사용할 수 있는건 C표준(ANSI인지 POSIX인지 가물가물)에선 안되는 걸로 알고 있습니다.
하지만 요즘 컴파일러들이 똑똑하고... C++에선 중간 변수 선언을 허용하기 때문에 오히려 초보자들에게 오해를 야기할 수 있습니다.
가능하면 C프로그램을 만드실 때는 변수 선언은 항상 앞에다 하세요.
C99 에서 정의한 것이고 gcc 3.x 에서 C99을 수용하기 때문에
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/
---
http://coolengineer.com
파싱에러에대해..
파서에러라는것은.....
원래 코딩을 하게되면. 컴파일러는 코드라인대로 줄을 해석합니다.
다시말해
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... ^^*
[quote]우리가 C언어하면서 GOTO쓰지말라고하는것도 이걸쓰면 파싱할
goto문 사용을 자제하라는 것은 구조적 프로그래밍의 개념에 위배되기
때문인 걸로 알고 있습니다.
하지만, 에러 처리 루틴 등에서 goto문은 아주 유용하게 사용됩니다.
실제로 리눅스 커널 코드를 보다보면 의외로 goto문을 사용한 코드가 많습니다.
어찌나 졸린지..~~
답변
와...처음 답변 달아 보네요 +_+ 여기 좋은 글들도 많고...
goto는 쓰는 사람이야 편하지만...프로그램을 읽기 힘들게 만들고
나중에 디버깅이나 그런게 하기 힘들다죠...
하지만 아주 잘쓴다면..정형화 해서...좋다고 들은거 같습니다.
커널 개발자들이 잘 쓴다고 합니다...
댓글 달기