Programming Language/C, C++ 38

Cast - reinterpret_cast, static_cast, const_cast, dynamic_cast

캐스트 : 형변환 C++스타일의 캐스트는 reinterpret_cast, static_cast, const_cast, dynamic_cast 등이 있다.   쉽게 말해 C 스타일의 캐스트는 식별자를 그냥 괄호로 둘러 싼 그것 float a = 1.23; int b = (int)a; 이게 바로 C스타일의 캐스트, 즉 형변환 이렇게 써놓으면 눈으로 찾기도 힘들고 내부적으로도 코드가 더러워지는 등 불편함이 있다고 합니다.   그런데 C++스타일의 캐스트는 static_cast(표현식) 이런식으로 작성됩니다.   예를들면, int형을 double형인것 처럼 결과를 내고싶다면 C스타일로는 int a, b; double result = ((double) a) / b; 요런식이겠지요   그런데 C++스타일의 캐스트를..

LPCTSTR, TCHAR, char

LPSTR = char* (롱포인터) LPCSTR = const char* (롱포인터콘스트)   이게 전부입니다.   TCHAR 영문권이 아닌 우리나라같은 경우에는 문자를 표현하기 위해 2바이트가 사용됩니다. 어떤건 1바이트로 처리되기도 하고 어떤건 2바이트로 처리되기도 하는데 이게 헷갈려서 wchar라는걸 만들었습니다. wchar는 모든 문자를 2바이트로 처리합니다   이 TCHAR는 wchar던 char던 신경안쓰고 걍 코딩하면 됩니다. 아스키 타입의 char라는 뜻   LPCTSTR 아스키 타입의 롱포인터 콘스트 캐릭터 ㅇㅋ?    LPCTSTR -> const char* 형변환 오류 프로젝트 속성 - 구성 속성 - 문자집합 - 유니코드로 되어있는 것을 멀티바이트 형으로 변경

struct, typedef

먼저 Typedef란 무엇이냐   Type Definition으로, 타입정의 자료형 자체를 인스턴스로 생성할 수 있습니다.   typedef unsigned int UINT; UINT라는 이름으로 unsigned int형을 사용하겠다. 요런 뜻입니다.    //(1) struct _tagPoint{      int x;      int y; }POINT;  //(1-1) struct _tagPoint{      int x;      int y; }; //(2) typedef struct _tagPoint{      int x;       int y; }POINT; //(2-1) typedef struct{      int x;       int y; }POINT; 하나씩 설명하겠습니다. (1)에서는 PO..

C++ TR1 설치

Technical Report로 줄여서 TR1이라고합니다. 새로운 표준라이브러리로 구버전의 VS2008에서는 지원이 안됩니다.표준라이브러리이기 때문에 그 쓰임새는 배열부터 시작해서 수학공식까지 다양합니다. 스탠다드 네임스페이스에 tr1으로 등록되어있기 때문에,std::tr1 이런식으로 호출해서 사용이 가능합니다. VC2008FeaturePack을 설치하면 되는데, VC가 영문버전이 아니면 지원되지 않습니다.여러 방법으로 설치 해보려 했으나 저의 경우엔 잘 되지 않았습니다. (2011년 11월 27일 기준입니다.) 그런데, 이 라이브러리 자체를 zip형태로 묶어놓은 버전이 있습니다.이 zip 버전을 설치하는 방법을 소개합니다. http://www.boost.org   접속  이 사이트에 접속하면 위 사진과..

inline 함수

인라인함수 #include inline int add(int a, int b){     return a - b;} int main(int argc, char* argv[]){     add(5,3);     return 0;} 위 프로그램의 결과값은 2입니다.inline을 붙이지 않는다고 해도 결과값은 똑같이 2입니다. 그럼 왜 inline함수를 쓸까요? inline을 쓰지 않았다고 가정하면실행과정은.. 1. 메인함수가 실행된다2. 메인함수가 멈춘다 (add함수 호출로 인해)3. add함수를 호출한다4. add함수에서 계산한 값을 리턴한다5. 메인함수로 리턴값을 돌려준다하지만, inline함수를 사용했다고 하면,실행과정은.. 1. 메인함수가 실행된다2. add함수가 실행된다3. add함수에서 계산한 값을..

릴리즈모드 링크에러

릴리즈모드 : 디버깅 없는 출판모드로 디버그모드보다 용량이 두배이상 작습니다.디버그모드 : 평소 사용하는 모드로, 오류발생시 수정을 위한 모드, 실행속도가 느립니다. 릴리즈모드로 돌릴때는 디버그모드보다 프로젝트 설정이 민감하게 작용합니다. 이런 에러가 난다면 1>링크하고 있습니다...1>libcvd.lib(convolve_gaussian.obj) : warning LNK4075: '/EDITANDCONTINUE'이(가) '/OPT:ICF' 사양으로 인해 무시됩니다.1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc이(가) LIBCMT.lib(malloc.obj)에 이미 정의되어 있습니다.1>LIBCMTD.lib(dbgheap.obj) : error LNK..

Namespace

namespace네임스페이스이름공간 VS2008이후 등장했습니다. 예를 들어, A와 B회사가 같이 프로젝트를 하는데,A회사에 int a; 변수가있고,B회사에도 int a; 변수가 있다면, 합쳤을때 변수가 중복되는 문제가 있습니다. 그럼 "B회사에서 int b;로 바꾸면 되지" 라고 하실 수 있으시겠으나대형 프로젝트에서는 일일히 그 변수명을 다 바꿔줄만큼 변수의 수가 작지않습니다. 엄청난 수작업을 요구하기도 하고요. 그래서 네임스페이스가 등장! 네임스페이스를 불러내려면 :: (스코프)를 이용해서 불러야합니다.네임스페이스이름::변수이렇게 부르면 끗. #include namespace A { double i;}namespace B{ int i;}void func(){ A::i=12.345; B::i=123; ..

HRESULT, LRESULT

HRESULT 32비트의 signed 형 정수BOOL형의 TRUE/FALSE와 마찬가지로 SUCCEEDED/FAILED를 사용합니다.하지만 BOOL과는 대조적으로 반드시 값을 리턴받지는 않아도 됩니다. if(FAILED(CreateWindow(...))){       MessageBox("윈도우 생성에 실패했습니다");} 여기서 FAILED에 주목할것이..윈도우 생성에 실패할 경우 CreateWindow()메서드에 문제가 생긴것이기 때문에, 저 메시지 박스가 뜨면 그냥 저 메서드만 보면 됩니다. 하지만, 주의할점이 BOOL형은 TRUE/FALSE가 1/0인데 반해HRESULT는 SUCCEEDED/FAILED가 0/1입니다. * HRESULT 형의 구조 0~15 비트 : RETURN CODE 16~28 비..