반응형

C++ 프로그래밍 32

C++ static_assert

C++ 11에 추가된 것으로 기존 assert이 실행 시간에 오류를 검증하는데 비하여 static_assert은 컴파일 타임에 오류를 검증합니다. static_assert은 컴파일 타임에 오류를 검증할 수 없는 변수 값을 대입하는 경우 상수 값이 있어야 한다는 오류를 냅니다. 이런 특성을 가진 관계로 주로 템플릿 프로그래밍에서 타입 체크 등에서 사용됩니다. 비주얼 스튜디오에서는 코드 작성 중에 static_assert이 false일 경우 표시를 해주어서 편합니다. 사용 예는 아래와 같습니다. static_assert(1

C++ 프로그래밍 2021.10.30

error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다.

가변 인자를 받는 함수에서 가변 인자들을 가변 인자를 받는 다른 함수를 호출할 때 ...를 생략할 때 발생할 수 있습니다. 에러가 발생하는 아래 예제 코드를 살펴보겠습니다. template void thread_log_t(const std::wstring fmt, arguments ... args) { wstring str = format_string(L"thread[%d]: ", std::this_thread::get_id()); str += format_string(fmt, args ...); str += wend_line; wcout args ... 와 같이 가변 인자를 제대로 넘기면 에러가 해결됩니다. 가변 인자를 넘기기 위하여 ...가 추가되었다는 것에 주의바랍니다. 해당 에러가 수정된 코드 예..

C++ 프로그래밍 2021.10.28

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

C++에서 stderr로 출력하기

요즘에도 stdout, stderr을 구분해서 출력하는지 모르겠지만 C/C++을 정석적으로 코딩한다면 에러 관련 내용은 stderr로 구분해서 출력하는 것이 좋다. stdout과 stderr로 구분하여 출력하면 Unix(Linux) Shell이나 Dos Shell에서 필터링해서 구분해 볼 수 있다. C 라면 아래와 같이 구분해서 출력할 수 있다. 물론 stdout을 사용한 부분은 그냥 printf을 사용해도 동일하다. fprintf(stdout, "test0\n"); fprintf(stderr, "test1\n"); C++ 이라면 아래와 같이 구분해서 출력할 수 있다. cout

C++ 프로그래밍 2021.10.11

C++ wstring용 가변인자 포맷(format) 스트링 만들기

C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다. 아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다. s..

C++ 프로그래밍 2021.10.08

More C++ Idioms

Idioms이란 구글의 정의에 따르자면 영어에서 둘 이상의 단어들이 연결되어 그 단어들이 가지는 본뜻 이외의 특별한 의미를 나타내는 관용어 혹은 숙어라는데 찾아보니 프로그래밍에서는 공통적으로 흔히 발생하는 문제 해결 코드라고도 쓰이는 듯 하다. 근데 개인적으로 보기에는 프로그래밍에서의 뜻은 일종의 언어에 기반한 팁 혹은 패턴으로 볼 수 있는거 같다. 물론 해당 패턴이나 팁들은 특정 상황에 대한 해결법을 제공해 준다고 보면 될 듯 하다. 여기서는 More C++ Idioms를 소개할까 한다. 관련 주소는 아래와 같다. More C++ Idioms 위키에 한창 정리되고 있는 것으로, 물론 내가 해당 이디엄을 습득해서 쓰면 좋겠지만 그 보다 더 좋은 것은 다양한 C++ 테크닉을 이해할 수 있다는 점과 유명 라..

C++ 프로그래밍 2017.02.19

64Bit Programming Models: Why LP64?

64-Bit Programming Models: Why LP64? Open Systems community에서 왜 LP64모델을 Unix표준으로 선택하였는가에 대한 요약입니다. LP64모델을 선택하기 위하여 포팅성(Portability), 32bit 환경과의 상호운용성(Interoperability with 32bit Enviroments), 표준 준수(standards conformance), 성능(performance effects), 전이비용(transition costs)을 고려하였습니다. 64bit모델을 고려하기 시작한 것은 H/W발전에 따라 4G이상의 주소에 직접적으로 억세스하려고 하는 것을 필요로 해졌기 떄문입니다. 기존의 64bit 환경에 대한 경험상 해당 환경의 개발자들은 32bit 프로..

C++ 프로그래밍 2009.08.22

C++ Technical Report 1 : Regular Expressions

정규식(Regular Expressions)는 텍스트 처리를 코드가 아닌 정규식을 바탕으로 처리하게해 생산성과 효율성을 높입니다. 쉽게 말하여 정규식을 처리를 위한 문자열에 대입하여 문자열 처리를 굉장히 빠르고 강력하게 할 수 있게 된다는 의미입니다. TR1의 정규식은 아래와 같은 6가지의 문법을 지원합니다. ECMAScript, default grammar and the most powerful basic, POSIX Basic Regular Expressions extended, POSIX Extended Regular Expressions awk, POSIX awk grep, POSIX grep egrep, POSIX grep -E Codeguru의 A TR1 Tutorial: Regular Exp..

C++ 프로그래밍 2009.07.31

C++ Technical Report 1 : Random Number Generation

난수 생성 기능이 굉장히 강력해지고 다양해 졌습니다. 기본적으로 알아야할 상식은 난수라는 것은 진정한 난수가 아닌 일정한 공식(알고리즘)에 의하여 생성되는 수라는 점입니다. 그것은 기존의 C의 방법으로 생성할 때 srand((unsinged int)time(NULL));을 써주지 않을 경우에는 프로그램이 실행될 때마다 매번 같은 난수 값이 반복된다는 것을 통하여 알 수 있습니다. TR1은 난수 엔진이라고 불리는 난수 발생 공식을 가진 템플릿 5개를 기본적으로 가지고 있으며 합성 템플릿을 가지고 이들을 조합하여 쓸 수 있습니다. 이런 기본적인 엔진 템플릿을 바탕으로 typedef가 되어 쉽게 쓸 수 있는 클래스가 TR1에 정의되어 있습니다. 그 다음으로 TR1에는 분산(Distribution)을 조정하기 ..

C++ 프로그래밍 2009.07.30

C++ Technical Report 1 : Metaprogramming and Type Traits

메타프로그래밍을 위한 부분으로 헤더에 관련된 내용을 담고 있습니다. Type traits는 generic code가 타입의 핵심 속성을 억세스 할 수 있게 해주며 타입간의 관계 결정 또는 관련 있는 타입 간의 변환을 가능하게 해줍니다. 이 부분은 TR1의 라이브러리를 공부하기 보다는 메타프로그래밍 관련 책을 사서 보심이 좋을 듯 합니다. 그 외에 온라인으로 볼 수 있는 관련 내용은 아래와 같습니다. boost 'TR1 By Subject' boost 'Chapter 1.Boost.TypeTraits' Metaprogramming 메타프로그래밍에 대하여 boost 'Background and Tutorial'의 내용을 바탕으로 간단히 이야기 해보면 다음과 같습니다. 메타프로그래밍은 템플릿 테크닉, 그 중에..

C++ 프로그래밍 2009.07.29

C++ Technical Report 1 : Function pobjects

Polymorphic Function Wrappers (tr1::function) 모든 Callables(함수포인터, 멤버함수 포인터 그리고 함수객체(Functor or Function Objects))에 대하여 단일한 wrapper를 제공합니다. ※ Callables라는 좋은 표현을 한국말로 어떻게 해야할지 모르겠군요... Function Object Binders (tr1::bind) std::bind1st 및 std::bind2nd의 일반화된 버전으로 함수 호출시 파라메터를 유연하게 지정하게 해줍니다. tr1::function의 최대 장점은 C시절의 함수포인터, C++의 멤버함수 포인터, STL과 같이 각광 받기 시장한 함수 객체를 단일 템플릿으로 처리하여 준다는데 있는 듯 합니다. 자세한 코드 설..

C++ 프로그래밍 2009.07.28

C++ Technical Report 1 (TR1) : Overview

C++ TR1은 C++ 표준 라이브러리에 대하여 새롭게 추가되는 라이브러리에 대한 기술 문서로서, 우리에게는 추가된 C++ 라이브러리를 의미합니다. 2005년 6월 24일에 제안된 문서가 현재 심사중에 있습니다. TR2은 C++0x가 나온 이후에 나올 것으로 예정되어 있습니다. TR1은 Visual Studio 2008 한글판과 같은 경우 Service Pack1을 깔면 쓸 수 있습니다. 이 버전에는 C99에 대한 호환성 부분과 수학라이브러리는 지원하지 않습니다. 또한 영문판과 같은 경우는 별도의 Feature Pack 2008을 다운받아서 깔아야 합니다. General Utilities Reference Wrapper (tr1::reference_wrapper) Boost.Ref에 기초합니다. 헤더에 ..

C++ 프로그래밍 2009.07.23
반응형