Why not?

C/C++ 표준 에서는 타입명(Class, Structure, Enumeration 등)과 동일한 이름의 변수명을 사용할 수 없도록 제한하고 있다.
즉,

class Test
{
........
};
Test Test = new Test(); // Error!!
이런 구문은 에러가 발생한다는 뜻이다.
너무나도 당연시 되던 이 제한.
왜 있는걸까?
참고로 C# 에는 이 제한이 없다.
필자가 찾아낸 한 가지 이유는 sizeof 키워드. 또 다른 이유가 있을까?

by 이창연 | 2007/10/05 16:20 | 프로그래머 생각 | 트랙백 | 덧글(5)

트랙백 주소 : http://lisyoen.egloos.com/tb/2224294
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by maenani at 2007/10/08 09:03
sizeof 와 비슷할 듯 한데..
class Test2 {}; 가 있을 때

Test2 Test = new Test2();

와 같이 쓸 수 있다면 문제가 되지 않을까요? ambiguity 문제가 생길 것 같습니다.
C#은 어떻게 그런 걸 피해가는지 궁금하네요..
Commented by 이창연(lisyoen) at 2007/10/19 14:23
안녕하세요 maenani 님.

Test2 Test = new Test2();
이게 어떤 문제가 있는건가요?
다르게 해석될 가능성이 없어 보이는데요.
Commented by maenani at 2007/10/19 17:04
그렇군요. 제 이해가 짧았네요... 아래 코드가 무난히 실행되는군요.
주석 부분 제거하면 컴파일 실패하구요.. (Linux 2.4 gcc-2.95.3, Linux 2.6 gcc-3.4.6 모두 해당)
주석 부분까지 들어가면 symbol 처리하는데서 에러가 생기는 듯 하네요. 타입으로 볼지
로컬 변수로 볼 지가 애매해져서 그런 걸까요?

#include <stdio.h>

class Test {
public:
char *m;
Test() {m = "Test";}
};

class Test2 {
public:
char *m;
Test2() {m = "Test2";}
};

int main(void)
{
Test2 *Test = new Test2();
//Test *Test2 = new Test();

printf("Test->m='%s'\n", Test->m);
//printf("Test2->m='%s'\n", Test2->m);

return 0;
}
Commented by 이창연(lisyoen) at 2007/10/29 15:14
네. 타입으로 볼 지 변수로 볼지 애매해지는 경우가 문제가 됩니다.
그런데 c/c++ 문법에서는 sizeof 를 제외하고는 타입과 변수가 동시에 위치할 수 있는 부분이 없어서요.
어떻게 쓰더라도 그게 타입으로 쓰인건지 변수로 쓰인건지 해석이 가능합니다.
sizeof 는 그 모두가 들어갈 수 있으므로 (C# 은 한쪽만 허용) 모호성이 생기겠죠.

보여주신 소스에서 주석 부분도 해석하는데 문제는 없습니다.
그냥 C 표준이 까칠한것 뿐이죠.
Commented by xissy at 2009/07/06 11:10
선생님, 여기서 이러시면 안됩니다.

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶