C++ (60) 썸네일형 리스트형 함수의 중복 정의 방지 [1. 개요]C++ 에서는 함수는 반드시 하나의 정의만 가져야 한다.이렇게 함수를 하나만 정의하는 방법은 아래와 같다.[2. .cpp 파일에 정의]가장 일반적인 방법으로, .hpp 파일에 함수의 선언을 명시하고.cpp 파일에 해당 함수를 정의 함.[3. .hpp 파일에 정의]기본적으로 .hpp 에 함수를 선언 및 정의 하는 경우 중복 함수 정의로 인해 컴파일 에러가 발생하게 된다.그러나 아래와 같은 경우는 중복 함수 정의로 처리하지 않는다.템플릿 함수 (컴파일 시점에 인스턴스화 해야 함)클래스의 멤버 함수 나 static 함수inline 함수여기서 inline 함수는 중복 함수 정의로 처리하지 않는 점을 유념하도록 한다. 버퍼에 안전한 문자열 함수 [1. 개요]기존 strcpy 나 strcat 등은 버퍼 길이를 체크하지 않아서, 버퍼 오버플로우에 취약 함.그래서 버퍼 길이를 인자로 받는 버퍼에 조금 안전한 문자열 함수가 있어,가급적 이러한 함수를 사용하는 것이 권장 됨 함수 목록strncpystrncatsnprintfstrncmp마지막 NULL 문자로 채워지는 것을 보장하지 않음.const char* cstr = "Hello" 를char buf[5] 에 복사 시, buf[4] = 0; 이 아님 가급적, (총 버퍼 길이 - 1) 을 넘기는 편이 좋아 보임 또한, strncat 에서는 (concat 위치 부터 남은 버퍼 길이 - 1) 을 넘기는 편이 낫다.[2. 예제]#include #include int main(){ const char* st.. 스레드에 안전한 localtime() [1. 개요]localtime() 함수는unix timestamp 에 대해서, 연/월/일 시간/분/초/밀리초 단위로 구할 수 있다. 그러나, 리턴 값에 대해서 리소스를 해제하는 코드가 없기에 내부적인 정적 버퍼의 주소를 리턴 하는 듯 한데,실제로 그러하다. 따라서 이 함수는 스레드에 안전하지 않다.스레드에 안전한 함수는 플랫폼 별로 아래와 같다.Linux 계열 : localtime_r()Windows 계열: localtime_s()[2. localtime_r 예제]#include #include int main(){ const std::time_t ntime = std::time(nullptr); const struct tm * tm0 = localtime(&ntime); std::cou.. libcurl 빌드 [1. 개요]윈도우(Windows10, 32bit 용 라이브러리) 와 리눅스 (Centos7 기준) 에서 libcurl 을 소스코드에서 빌드 하는 방법을 정리한다.libcurl 빌드 시, 별도의 옵션을 명시하지 않으면, https 통신은 되지 않는다.여기서는 https 통신을 위해 openssl 을 이용하여 빌드 하도록 한다.openssl 빌드 방법은 아래 참조https://testkernelv2.tistory.com/792https://testkernelv2.tistory.com/791CMake 를 이용하는 방법도 있으나, 아래 방법을 사용하는 편이 더 좋아 보임[2. 리눅스 기준]github 등에서 소스코드 압축파일 해제 후, 폴더 진입 한 곳을 현재 디렉터리가 가정하면,$ autoreconf -fi.. libcurl 관련 사용 예제 [1. 개요]curl_global_init() - 대부분의 플랫폼에서 스레드 안전 할 수 있으나, 보장하지 않는다. curl_easy_init() curl_easy_cleanup() curl_list_append() - 최초 NULL 인 경우 리소스를 할당해준다. - 반환 값이 NULL 일 수 있다. curl_slist_free_all() curl_easy_setopt()- CURLOPT_URL- CURLOPT_POST- CURLOPT_POSTFIELDS- CURLOPT_POSTFIELDSIZE- CURLOPT_HTTPHEADER- CURLOPT_USERAGENT- CURLOPT_WRITEDATA # CURLOPT_WRITEFUNCTION 를 사용하지 않는다면 # 반드시, FILE* 를 넘.. boost 비동기 이론 [1. 개요]boost 에서 비동기 프로그램 작성에 대한 배경 지식을 정리하도록 한다.io_contextstrandstd::enable_shared_from_this논블로킹 IO 와 달리 비동기 IO 는 별도의 스레드로 동작하는 이벤트 루프가 필요하다.논블로킹은 일종의 폴링 과 같은 방식이기 때문이다.[2. io_context]boost 에서 io_context 는 내부적으로 큐를 갖고 있고, 이 큐에 비동기 작업이 등록되며io_context.run() 을 호출하면 큐에 쌓인 작업을 하나씩 꺼내서 실행하게 된다.std::vector> threads;for (unsigned i = 0; i thread = std::make_shared( // 멀티 스레드를 통해 // io_con.. segmentation fault 사례 6 [1. 개요]C++ 표준에 근거한 멤버 변수 초기화 순서를 지키지 않음으로 인해 발생한 fault 사례 정리[2. 참조자]어떤 객체가 참조자를 멤버 변수로 포함하고 있는 상태에서,이 참조자가 제대로 초기화 되지 않고, 이 참조자를 접근 할 때 문제가 발생 할 수 있다. 일반적으로 참조자가 포인터 처럼 NULL 값 이 들어오는 상황은 거의 없지만, (컴파일 오류..)아래와 같은 C++ 표준 상, 참조자가 유효하지 않은 메모리를 가리키는 상황이 발생 할 수 있다.- 멤버 변수는 선언된 순서대로 초기화 된다.- 생성자 이니셜라이저 리스트 순서와 관계 없다.- ISO/IEC 14882, 12.6.2[3. 예제]#include class A{ public: int a; A(cons.. 산출물 관련 설정, 공유 라이브러리 [1. 개요]리눅스 기준, 빌드 결과물이 공유라이브러리 (.so) 파일에 의존하는 경우특히 boost 나 tbb 등 기본적으로 시스템에 설치 된 라이브러리가 아니라 별도 라이브러리 인 경우 프로그램 시작 시, 필요 한 공유 라이브러리를 로드 하지 못하여 실행하지 못할 수 있음.윈도우의 경우 현재 디렉터리를 기준으로 찾는 시늉(?) 이라도 하는 것 같던데,리눅스는 그렇지 않음. 여기서는 기본적으로 산출물이 공유 라이브러리를 찾는 기준을 설정하는 법을 정리한다.[2. RPATH]readelf -d "mybinary" 를 살펴 보면 RPATH 항목이 있음. 이 항목은 cmake 로 프로젝트 설정 시 -DCMAKE_SKIP_BUILD_RPATH=TRUE 로 설정하면 제거 할 수 있으나, 서비스 환경에 배포 시,.. 빌드 방법 [리눅스 기준] [1. 개요]윈도우와 전체적인 맥락은 비슷 함./Configure '-Wl,-rpath,$(LIBRPATH)'# 혹은 Perl Configuremake 산출물libssl.alibcrypto.alibcrypto.so# => libcrypto.so.3libssl.so# => libssl.so.3[2. update]윈도우 설치와 같이, --prefix 와 --openssldir 을 명시하는 편이 좋음./Configure --prefix=$(pwd)/release --openssldir=$(pwd)/releasemakemake install# --prefix 와 --openssldir 에 명시한 곳에, 개발에 필요한 파일들이 위치하게 됨. 빌드 방법 [윈도우 기준] [1. 개요]빌드 환경윈도우 10Visual studio 2017 기준필요한 툴perlnasmnmakeclrcperl 은 아래 url 을 통해 다운 받도록 한다.https://strawberryperl.com/releases.htmlnasm 은 mingw 나 perl 다운 시 같이 받을 수 있다. 나머지 툴은 Visual studio 2017 설치 후,"vs 2017 용 x64 네이티브 도구 명령 프롬프트" 를 에서 동작을 확인하도록 한다.Visual studio 2015 나 2019 등을 사용하는 경우, 각 빌드에 맞는 프롬프트를 실행하도록 한다.해당 프롬프트에서 아래 작업을 진행하도록 한다. 소스코드를 아래 url 을 통해 다운 받은 후, 소스 디렉터리로 이동하도록 한다.https://github.c.. 이전 1 2 3 4 ··· 6 다음