본문 바로가기

C/C++

[Google C++ Style Guide] 5. Other C++ Features Google C++ Style Guide 5. Other C++ Features A. Reference Arguments (참조자 인자)참조자로 넘겨지는 모든 파라미터는 const 를 붙인다. 정의 :C에서는 함수의 파라미터를 수정할 필요가 있을 때, 포인터를 사용한다, 예, int foo(int *pval). C++에서는 그 대안으로 파라미터를 참조자로 선언할 수 있다. int foo(int &val). 장점 :참조자로 파라미터를 정의하면, (*pval)++과 같은 지저분한 코드를 피할 수 있다. 복사 생성자와 같은 함수들에게 필요하다. 참조자는 포인터와 달리 NULL값이 불가능하다. 단점 :참조자는 포인터 의미가 아닌 변수 구문을 갖기에 혼동될 수 있다. 결론 : 함수 파라미터에서 모든 참조자는 co.. 더보기
[Google C++ Style Guide] 4. Google-Specific Magic Google C++ Style Guide 4. Google-Specific Magic구글이 C++ 코드를 보다 견고하게 만드는 트릭과 유틸리티와 다른 곳에서 보던 코드와는 다른 구글만의 C++코드를 보여준다. A. Smart Pointers포인터를 사용해야 한다면, boost::scoped_ptr를 사용한다. 객체가 STL 컨테이너를 담는 경우처럼 특정 조건 하에서는 std::tr1::shared_ptr 만을 사용해야 한다. 절대 auto_ptr을 사용하면 안된다. ‘스마트’ 포인터는 포인터처럼 동작하는 ‘객체’이다. 따라서 메모리를 스스로 관리한다. 예를 들어scopted_ptr이 파괴될 때 포인터가 가리키는 객체를 소멸시킨다. shared_ptr도 마찬가지이지만, 참조 카운팅 방식 스마트 포인터로 참.. 더보기
[Google C++ Style Guide] 3. Classes Google C++ Style Guide 3. ClassesA. Doing Work in Constructors (생성자의 역할)일반적으로, 생성자는 멤버 변수를 초기화 해야 한다. 초기화가 복잡하면 Init() 함수를 사용한다. 정의 : 생성자의 구현부에 초기화를 수행한다. 장점 : 타이핑이 편리하다. 클래스가 초기화 되었는지 걱정할 필요가 없다. 단점 : 아래와 같은 문제가 있다.- 생성자에서 예외를 사용하는 에러 처리가 어렵다. (예외가 발생하면 안된다)- 초기화 작업에 실패가 발생하면 객체는 생성되지 않으며 불명확한 상태가 된다.- 만약 가상 함수를 콜한다면, 서브 클래스로 전파되지 않는다.- 만약 누군가 전역 변수를 만든다면, 생성자는 main() 이전에 호출될 것이며, 생성자 코드내에서 암시적.. 더보기
[Google C++ Style Guide] 2. Scoping Google C++ Style Guide 2. ScopingA. Namespaces (네임 스페이스).cc(.cpp) 파일에 이름없는 namespace를 사용한다. 프로젝트나 경로를 기반으로 namespace의 이름을 정한다. using 명령어를 사용하지 않는다. 정의 :이름 공간(Namespace)은 개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 namespace는 전역공간에서 이름 충돌을 하지 못하도록 하는데 유용하다. 장점 :namespace는 (계층적) 네임 축(axis of naming) 을 제공하며 클래스에 의해 제공되는 네임 축도 포함된다. 예를 들어 전역 공간에 두 개의 다른 프로젝트에 클래스 Foo가 존재한다면, 런타임 또는 컴파일 타임 시 충돌이 발생한다. 이 충돌을 방지하기 .. 더보기
[Google C++ Style Guide] 1. Header Files http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml 위의 내용을 제 나름대로 번역한 겁니다.물론 오역 굉장히 많습니다 --; C++ 프로그래밍 적인 면에서 스콧 마이어스의 Effective C++에서 보던 내용이 많고,스타일은 리눅스 계열의 스타일인것 같아 제가 당장 쓰기 어려운 것도 많습니다.그런것은 제 나름대로 사용하면 될 것 같고,문서에도 나와있지만, 정답이 없는 코딩 스타일의 경우는 일관성이 가장 중요해 보입니다. 긴 내용이라 챕터별로 올립니다. (전문은 파일 첨부) Google C++ Style Guide 1. Header Files 단위 테스트와 main()함수만 있는 .cpp파일을 제외하고 일반적으로 모든 .cpp파일은 .h파일과 .. 더보기
정적 분석 도구 - Cppcheck 정적 분석 도구 - Cppcheck C/C++을 위한 정적 분석 도구 (A tool for static C/C++ code analysis)로 Cppcheck가 있습니다. 아래 사이트에 다운로드 및 자세한 설명이 나와 있습니다.http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page 정적 분석이 무슨 말인지는 잘 모르겠네요... 여하튼,정적 분석 방식에는 소스 코드를 분석하는 방식과 바이너리를 분석하는 방식이 있습니다.Cppcheck는 소스 정적 분석 도구이고 무료 입니다. !!! Cppcheck는 소스 코드 구문을 분석하여 오류를 검출하며 마이크로소프트 윈도우와 유닉스 계열의 운영체제에서 모두 사용가능 합니다. Cppcheck로 .. 더보기
[C,C++/Python] C,C++에서 Python의 참조카운트 사용 파이썬 참조 카운트 C와 C++같은 언어에서는 동적 메모리 할당(malloc(), new) 및 해제(free(), delete)를 프로그래머들이 직접 관리해 줍니다.메모리 할당을 받았으면 메모리 해제를 해줘야 하는데, 이게 꽤 꼼꼼한 확인이 필요합니다.정상적으로 수행되고 있을 때는 물론, 에러가 발생하거나 예외가 발생했을 상황도 고려해야 한다는 거죠 파이썬에서는 레퍼런스가 필요할 때 마다 maoolc()과 free()와 같은 함수를 써서 새로운 메모리 공간을 확보하지 않고 타입에 대한 인스턴스의 레퍼런스 카운트를 통한 객체 참조 전략을 가지고 있습니다.즉, 모든 객체는 자신이 참조된 횟수를 관리하는 카운터를 가지고 있고, 객체가 참조될 때마다 카운터를 하나씩 증가시키고, 참조가 해제 될 때 마다 레퍼런스.. 더보기
expat 설치 및 사용방법 expat 설치 및 사용방법 아래 링크를 따라가세요 (그림 붙여넣기도 안되고, 싸이월드 넘 불편함)http://hyunu.tistory.com/71?srchid=BR1http://hyunu.tistory.com/71 위 링크를 따라가면 expat 소스 링크 및 예제 소스도 있으니 참고하시고,, 아래 링크에서 expat를 다운로드 및 레퍼런스가 있으니 이것도 참고하세요...http://expat.sourceforge.net/ http://www.xml.com/pub/a/1999/09/expat/reference.html 더보기
참조 카운팅 (Reference Counting) - 2 참조 카운팅 구현 참조 카운팅 기능을 갖는 String 클래스를 만드는 일은 어렵지 않습니다만, 고려해야할 세부사항이 있습니다. 그래서 멤버 함수부터 차근히 살펴볼 필요가 있습니다. 물론, String이 가지는 값에 대한 참조 카운트를 저장할 장소가 필요한 건 당연하지만, 굳이 String 객체에 있을 필요는 없습니다. 실제문자열 값 하나에 대해서 참조 카운트는 하나만 있으면 되기 때문이죠. (String 객체마다 참조 카운트를 하나씩 두지 않아요). 즉, 참조 카운트와 값을 묶어서 관리해도 된다는 뜻입니다. 이 클래스의 이름은 StringValue로 하고, String 클래스의 구현을 보조하는 역할이기 때문에 private 영역에 이 클래스를 중첩시킵니다. 덧붙여 StringValue 데이터 구조는 S.. 더보기
참조 카운팅 (Reference Counting) - 1 참조 카운팅 (Reference Counting) 여러 개의 객체들이 똑 같은 값을 가졌으면, 그 객체들로 하여금 그 값을 나타내는 하나의 데이터를 공유하게 해서 데이터의 양을 절약하는 기법 목적1. Heap 객체를 둘러싼 내부 정보를 유지하는 작업을 단순하게 하자2. 똑 같은 값을 가지고 있는 객체들이 그 값을 하나씩 꿰어차도록 놔두는 것은 낭비 목적 1> 어떤 객체가 new에 의해 할당되고 난 후에는, 그 객체의 주인이 누구인지 따라가야 하는 것은 숙명이자 운명입니다. new한 쪽에서 bew로 만든 포인터를 해제해야겠지요. 하지만 프로그램이 실행되면서 이 객체의 소유권이 이 객체에서 저 객체로 왔다 갔다 할 수 있기 때문에, 객체의 소유권을 추적하는 일은 상당히 까다롭습니다. 특히 포인터를 매개변수로.. 더보기