C
void test(void)
{
int a = 3; //ok
int b;
b = 3; //ok
int c; //err
...
}
C++
void test(void)
{
int a = 3; //ok
int b;
b = 3; //ok
int c; //ok
...
}
왜 이런 차이가 있는지 알았던 듯도(하다는건 결국 모른다는 이야기- _;) 한데.. 하여간 그렇습;
- 2008/08/28 21:26
- handmade.egloos.com/4579637
- 덧글수 : 8


덧글
nVec 2008/08/28 21:46 # 답글
정확히는 컴파일러의 차이입니다.어떤 컴파일러에서는 C여도 위와 같은 프로그래밍이 가능합니다.
WERT 2008/08/28 22:35 # 답글
이 코드를 보니 눈물이 앞을 가립니다. 어제부터 삽질한 것만 생각하면..
느낌으로 2008/08/29 01:06 # 답글
C++ 컴파일러는 위에서 아래로.. 아래에서 위로 2번 읽어서 컴파일 할껄요??C컴파일러는 위에서 아래로 한번만 읽어서 컴파일 하구요..
그래서 C언어는 맨 위에다가 선언을 다 해놔야 되는거구요..C++에서는 중간에 해도 되는거에요
승네군 2008/08/29 08:44 # 삭제 답글
C99인가 하는 스펙부터 중간에 선언이 허용되지 않나요? 음... 들었던 풍문으로는 그랬던 듯도 싶은데요..^^;결과로 놓고 보자면, C의 경우는 1pass parsing을 하고, C++의 경우 2pass parsing(위부터 아래로던 아래부터 위로던)을 하는거 같은데요.
만약 C도 2pass parsing을 한다면, 변수가 어디에 선언되던지 별 상관은 없어 보이구요..^^;
견우 2008/08/29 09:20 # 답글
C, C++ 모두 2-pass compiler 입니다.... 그러므로 C언어도 마음만 먹으면 중간선언이 가능하단이야기죠..하지만 C의 경우 허용이 되지 않는 이유는 애초 컴파일러 설계시 변수를 중간에 선언하게 되면, 코드가 지저분해보인다던지 컴파일러 구조가 복잡해진다던지..설계당시 개발자의 철학에 따라 그렇게 정해진 것일 뿐으로 보입니다. 웹서핑을 해보니 혹자는 애초 C컴파일러는 1-pass, 2-pass 방식 모두 지원했기 때문에 불가피하게 변수 중간선언을 지원하지 못했다는 사람도 있더군요..^^.. 다시 생각해보면 C++ 컴파일러로 현재도 C소스, C++소스 모두 컴파일됩니다.. 하지만 C는 중간변수 선언이 허용되지 않고 C++은 되지요.. 즉 이러한 문제는 1-pass 냐, 2-pass 문제가 아닌 컴파일러 설계자의 철학과 관련이 있지 싶네요~
나우 2008/08/29 09:27 # 삭제 답글
2-phase아냐? pass도 맞나?;
이덕희 2008/09/17 00:42 # 답글
무슨 근거로 "정확히 컴파일러의 차이"라고 단언하시는지 모르겠습니다.2 pass 차이 언급하시는 분들은 Turbo C(1 pass)와 MS C(2 pass)시절 이야기하시는 것 같네요.
C/C++은 언어(명세)와 구현자(컴파일러)가 철저히 분리된 언어중 하나이고,
C언어에는 본래부터 함수의 중간에 변수를 선언할 수 없고 C99에서 명세에 추가되었습니다.
(2 pass 컴파일을 하는) C컴파일러에서 함수 중간에 변수를 선언할 수 있다면 그것은 C언어 표준이 아닙니다. (C99 이전)
많은 분들이 명세는 모르고 관념적으로 알고 계시네요. (물론, 저를 포함해서)
승네군 2008/09/17 12:42 # 삭제 답글
...저보고 말하시는줄 알고 '흠칫..뜨끔..'.. 했었습니다. 후... 제가 아니니 다행이다 싶기도 하고..^^;근데, 랭귀지를 스펙까지 보면서 쓰는 사람이 그렇게 많지는 않을거 같습니다.
그냥.. c/c++ 뭉뚱그려서 .cpp로 놓고 써 버리는 형국이니까요..
(그리고, 그렇게 해도 별 문제될 꺼리는 없다는게..^^;)
2pass(인지는 잘 모르지만..우선은..) 이야기가 나오는 이유는 학교에서 배웠으니까요.. 그러니 그만큼 오래된 이야기가 나오는것이구요. 아시다시피, 학교라는게 10년전 내용을 지금까지도 반복 교육하는 경우가 왕왕 있으니까요..^^; (물론, 결과적인 잘못은 공부를 안한 내탓 입니다만..ㅎㅎ;)