'컴파일러의 분석'에 해당되는 글 1건

  1. 2009.07.31 컴파일러의 분석. 4
[ Programming ]2009. 7. 31. 17:27
내가 생각하는 것이 컴파일러가 분석하는 것과 똑같다면 아마도 난 지금쯤 C++의 고수?쯤 되어 있지 않을까 싶다. 멋진 게임을 만들고 있을 것이고 유능한 프로그래머가 되서 여기 저기 국내뿐만 아니라, 해외 여기 저기서 날 스카웃 할려고 노력 할것이다.
하지만, 현실은....-_-;; 내가 아는 것이 별로 없고 컴파일러의 분석을 제대로 파악 하지 못했기 때문에 항상 제자리 걸음이고 책을 늘 봐야 하는 현상에 있는 것이 현실인것 같다는 생각이 든다... 안되는건 알고 있었는데 설명을 하라고 하면.... "안되니깐요..." 라고 말을 할수가 없지 않은가!! 오늘 알게 됐다...
#include "stdafx.h"
#include < iostream >
class CWidget
{
public: CWidget() {} CWidget(const int _iIndex): m_iIndex(_iIndex) {} ~CWidget() {} void Show() { std::cout << "Index " << m_iIndex << ": CWidget 출력" << std::endl; } private: int m_iIndex; }; int _tmain(int argc, _TCHAR* argv[]) { CWidget widget1(1); widget1.Show(); CWidget widget2(); widget2.Show(); return 0; }
결론부터 말하면 첫번째 부분 widget1(1) 는 에러를 발생하지 않고 두번째 출력부분 widget2()는 에러를 발생한다.
왜 그런가? 이유는 컴파일러의 분석이 내가 생각하는 것과 다르기 때문이다.
/// 보통 우리가 쓰는 함수 선언.
int Test(const int _i);	
/// 위와 같은 것입니다. ()는 무시 됨.
int Test(const int (_i));/// 매개 변수의 이름이 생략 되도 같은 것임.int Test(const int);
위의 3가지 함수 선언은 똑같습니다.
/// Test2는 함수 포인터( 인자는 없고, int를 리턴하는 )를 매개변수로 받음.
int Test2(int (*pFun)());
/// 위와 같음 pFun를 포인터로 인식 - C와 C++에서 유효한 문법임.
int Test2(int pFun());/// 위와 역시 같음. 매개 변수의 이름이 생략 된 것임.
int Test2(int ());
역시 위의 3가지 함수 선언은 같습니다.

즉, 매개 변수를 둘러싼 괄호는 무시 되어도 무방한 것이지만, 그냥 괄호는 함수의 매개 변수 리스트가 있음을 나타내는 것입니다. 그 자체가 함수의 포인터임을 알리는 것입니다.

이젠 에러가 나는 이유를 설명 할수 가 있는데, 내가 생각한것은 Widget w()는 인자값이 없는 기본 생성자를 통해서 객체를 생성 하려고 한것이지만, 컴파일러의 분석은 그게 아니란 말이죠.. 컴파일러는 단순히 Widget를 반환하는 매개변수가 없는 함수w를 선언한 건뿐입니다.

아... 이런것도 모르다니... 젠장
Posted by 냉동