본문 바로가기
Development/Free Topic

C++ 프로그래밍

by IMCOMKING 2014. 11. 26.

- window에서 하위 폴더까지 파일 목록 가져오기

#include "stdafx.h"

#include "windows.h"

#include "winbase.h"

#include "stdio.h"

#include "cstringt.h"

#include "atlstr.h"


bool FindnFile( const wstring strPath ) 

{

bool bContinue = true;

WIN32_FIND_DATAW FindFileData;

HANDLE hFind;

wstring strFindPath, strFileName;

wstring FullPathName;

strFindPath.assign(strPath+L"\\*.*");

hFind = FindFirstFileW( strFindPath.c_str(), &FindFileData );

//wprintf(strFindPath.c_str());

//printf("\n");

if( hFind == INVALID_HANDLE_VALUE ){

//printf ("FindFirstFile failed (%d)\n", GetLastError());

return false;

}


while( bContinue )

strFileName.assign(FindFileData.cFileName);

if( ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY )

{

if( strFileName.compare(L".") !=0 && strFileName.compare(L"..") != 0 )

strFindPath.assign(strPath+L"\\"+strFileName);

FindnFile( strFindPath );

}

}

else {


FullPathName.assign(strPath+strFileName);

wprintf(FullPathName.c_str());

printf("\n");

}


if( FindNextFileW( hFind,&FindFileData ) == FALSE )

bContinue=false;

}

FindClose( hFind );

return true;

}




non blockingsystem call : non blocking으로 프로세스 실행시키기

윈도우 : system("START /B 이름");
리눅스 : system("이름 &");


- 다른 헤더파일에 선언된 전역변수를 가져와서 쓰려면, #include 대신, extern 변수명 을 해주어야한다.


- stdafx.h 파일 내용을 바꾸면 생각지도못한 링크 및 컴파일 에러가 난다.


- C++에서의 싱글톤(Singleton) 디자인 패턴

http://vallista.tistory.com/48


- friend 선언

전역 함수나 클래스에서 어떤 클래스의 private 멤버 변수에 접근해야할 수 있게 해주는 기능.

캡슐화에는 벗어나지만, 특정 라이브러리(ex) SDL 라이브러리)가 전역 함수를 반드시 써야만 사용가능한 경우 등에서 유용하다.

http://warmz.tistory.com/890


- 함수 포인터와 멤버 함수 포인터

일반 전역 함수의 포인터와 클래스의 멤버 함수 포인터는 시그니쳐(형식)이 다르다.
따라서 일반 전역 함수를 받는 함수 포인터에는 멤버 함수 포인터를 전달할 수 없다.

http://www.gpgstudy.com/forum/viewtopic.php?p=115092

http://ncanis.tistory.com/319

http://blog.eairship.kr/m/post/255


- 순환 참조 문제

교차 참조, 순환 참조가 문제를 일으키는 이유 : 컴파일러가 두 파일에서 헤더파일을 복사해 올 때, 서로가 서로의 헤더를 포함시켜 무한루프가 발생한다. 이때 #pragma once 같은 키워드를 사용할 경우, 두 번째 복사 시도시 아이에 헤더를 가져오지를 않아 한쪽 파일에서는 헤더가 아이에 읽히지 않게되고, 따라서 크 파일은 컴파일 에러가 발생한다.

http://ekessy.tistory.com/20

즉 순환 참조란 중복 참조와는 다르게 A, B 두 클래스에서 서로의 헤더파일을 include 하는 경우이다. 이 경우 메크로를 이용해 중복 헤더 파일을 막더라도 위와같은 문제로 해결 할 수 없다.

이런 순환 참조(Circular dependency)가 발생하였을 때의 문제는 전체 아키텍쳐의 설계가 잘못 되었기 때문이다.

이를 해결하는 방법으로 제일 좋은 것은 순환 참조가 일어나지 않게 다시 설계하는 것이다.

https://kldp.org/node/59903

http://stackoverflow.com/questions/4734998/circular-dependency-best-practice/4735091#4735091

설계 방법으로는 대표적으로 부모 클래스를 이용하여 상호 참조가 일어나는 부분을 두 클래스에게 상속해주는 방식이 있다.


그다음으로는 전방 클래스 선언이 있다. 이 경우는 설계를 바꾸지 않아도 되는 편리함은 있지만, 역시 문제를 완전히 해결하는 것은 아니다.

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=279285&ref=279276

http://parkjunehyun.tistory.com/entry/%ED%81%B4%EB%A0%88%EC%8A%A4-%EC%A0%84%EB%B0%A9-%EC%84%A0%EC%96%B8Forward-declarations%EC%99%80-%EC%83%81%ED%98%B8-%EC%B0%B8%EC%A1%B0-%ED%97%A4%EB%8D%94-%ED%8C%8C%EC%9D%BC-%EC%B6%9C%EC%B2%98-%ED%81%B4%EB%A0%88%EC%8A%A4-%EC%A0%84%EB%B0%A9-%EC%84%A0%EC%96%B8Forward-declarations%EC%99%80-%EC%83%81%ED%98%B8-%EC%B0%B8%EC%A1%B0-%ED%97%A4%EB%8D%94-%ED%8C%8C%EC%9D%BC%EC%9E%91%EC%84%B1%EC%9E%90-%EC%B0%AC%EB%9E%80%ED%95%9C%EB%B9%9B



- stdafx

이 파일은 Visual Studio에서 precompile 이라는 기능을 키면 필요한 파일이다.

간단히 말해 빠른 컴파일을 위해, 수정되지 않은 cpp파일은 다시 컴파일 하지 않고 건너 뛴다는 것이다.

이 경우 반드시 모든 cpp파일 위에 #include "stdafx.h" 를 참조해주어야 에러가 나지 않는다.

http://soyoja.com/372



- #pragma once

모든 헤더파일 위에 위 선언을 해주자.
#ifndef / #endif 보다 더 빠른 컴파일 속도를 보이며 기능적으로 아무런 문제가 없다.

http://oojjrs.tistory.com/32


- 클래스 static 멤버 변수 초기화

클래스 내에 static 멤버 변수를 선언한 경우, 반드시 class내부가 아닌 외부에서 초기화를 해주어야한다.

ex) player_video_component main_controller::pvc = player_video_component();


http://pacs.tistory.com/entry/C-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-static

'Development > Free Topic' 카테고리의 다른 글

추천하는 소프트웨어 스택  (0) 2015.03.03
C++ STL의 Vector 사용법  (0) 2014.12.04
Visual Studio  (0) 2014.11.24
안드로이드 Thread 사용하기  (0) 2014.10.05
RESTFUL API  (0) 2014.07.22

댓글