Languages & Frameworks/C C++
Qt 로 빌드한 바이너리 배포하기
Qt 로 빌드한 바이너리 배포하기
2019.02.22Qt 자체를 static build하는건, 1. Qt 설치할 때 Source 선택해서 받은 다음 직접 빌드해야 하는데 nmake에러뜨고 빌드하는데 몇 시간 씩 걸리고 이래서 할 짓이 못됨.2. 오픈소스 버전은 static 배포를 금지하고 있다고 함(?) 그냥 같은 디렉터리에 dll 같이 넣어서 배포해주면 됨. release로 빌드하는 것 잊지 말고, *d.dll은 debug로 빌드했을 때 사용. sysinternals에서 ListDlls 받아가지고 어느 dll을 참조하는지 알아낸 다음 그냥 .exe가 위치한 디렉터리로 복붙하면 된다. 그리고 아마 Qt\.....\plugins에 있는 것들은 복사 해도 안될텐데, 이건 따로 설정파일을 두어야 함. .exe가 위치한 디렉터리에 qt.conf로 파일 하나 생성..
[C/C++] print를 하거나 문자열을 리턴하는 함수. 어떻게 구성하는게 좋은가? : string을 리턴하자.
[C/C++] print를 하거나 문자열을 리턴하는 함수. 어떻게 구성하는게 좋은가? : string을 리턴하자.
2019.01.25보통 "input은 인자, output은 리턴"으로 작성하는 편이 알아보기 쉽기 때문에 함수 인자로 포인터를 넘겨 이 포인터에 쓰는 방식으로 간접적으로 값을 되돌려 주는 것 보다, 명확하게 어떤 값을 리턴하도록 작성하는 편이다. 그러나 C같이 garbage collection이 안되는 언어에서는 어떤 값을 리턴하도록 작성하면 여러가지 이슈를 겪는 경우가 있다. *** 또한 GC가 안되는 언어에서는 in/output을 명확히 작성한다 해도 반드시 순수 함수라고는 볼 수 없다. 함수 내부에서 ``c malloc()`` 등을 호출하면 side-effect이 생기기 때문. 예를 들면 다음과 같은 상황이다. malloc() : 문제점 - 바깥에서 free()```cchar* parse_something(const..
Effective Modern C++
Effective Modern C++
2019.01.221장 형식 연역항목 1: 템플릿 형식 연역 규칙을 숙지하라항목 2: auto의 형식 연역 규칙을 숙지하라항목 3: decltype의 작동 방식을 숙지하라항목 4: 연역된 형식을 파악하는 방법을 알아두라 2장 auto항목 5: 명시적 형식 선언보다는 auto를 선호하라항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 3장 현대적 C++에 적응하기항목 7: 객체 생성 시 괄호(())와 중괄호({})를 구분하라항목 8: 0과 NULL보다 nullptr를 선호하라항목 9: typedef보다 별칭 선언(using)을 선호하라항목 10: 범위 없는 enum보다 범위 있는 enum을 선호하라항목 11: 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라항목 12: 재정의 함수들..
More Effective C++
More Effective C++
2019.01.22Chpater 1 기본 개념들항목 1 :포인터(pointer)와 참조자(reference)를 구분하자항목 2 : 가능한 C++ 스타일의 캐스트를 즐겨 쓰자 항목 3 : 배열과 다형성은 같은 수준으로 놓고 볼 것이 아니다항목 4 : 쓸데 없는 기본 생성자는 그냥 두지 말자 Chpater 2 연산자(Operators)항목 5 : 사용자 정의 타입변환 함수에 대한 주의를 놓지 말자항목 6 : 증가 및 감소 연산자의 전위(prefix)/후위(postfix) 형태를 반드시 구분하자항목 7 : &&, ||, 혹은 . 연산자는 오버로딩 대상이 절대로 아니다 항목 8 : new와 delete의 의미를 정확히 구분하고 이해하자 Chpater 3 예외(Exceptions)항목 9 : 리소스 누수를 피하는 방법의 정공(正攻..
Effective C++
Effective C++
2019.01.22Chapter 1 C++에 왔으면 C++의 법을 따릅시다항목 1: C++를 언어들의 연합체로 바라보는 안목은 필수 항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자항목 3: 낌새만 보이면 const를 들이대 보자!항목 4: 객체를 사용하기 전에 반드시 그 객체를 초기화하자 Chapter 2 생성자, 소멸자 및 대입 연산자항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자항목 6: 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자항목 7: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자항목 9: 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하..
[C++] operator overloading
[C++] operator overloading
2019.01.22toString 같은, 문자열 반환 오퍼레이터두 가지가 있고, 두개 모두 오버로딩하는게 좋다.1. string cast operator캐스트 연산자를 이용한 한 방법이다.다음과 같은 상황에서 자동으로 string으로 캐스팅해서 반환해준다.```cppstd::string mac_str = src_mac_addr.toString()```C스타일의 출력(printf)을 사용하는 경우에도 이걸 이용해서 string으로 반환 받은 다음 .c_str()을 써서 변환해서 사용하는 식으로도 쓰인다. ```cppclass Foo {public: operator std::string() const { return "member to string!"; }}; Foo foo;std::cout
[C++] 구조체와 클래스의 차이 ( struct / class )
[C++] 구조체와 클래스의 차이 ( struct / class )
2019.01.22구조체와 클래스의 차이 : 기본 접근 지정자 말고는 없음.class는 기본적으로 `` private``struct는 기본적으로 `` public`` 생성한 객체의 위치는, 클래스냐 구조체냐가 결정하는게 아니라, new로 만들었느냐 그냥 선언했느냐가 결정.```cpp#include struct ST { int a;}; class CL {public: int a;}; int main(void) { struct ST s; s.a = 1; CL c; c.a = 1; printf("struct : %p\n", &s.a); printf("class : %p\n", &c.a); return 0;}``````struct : 0x7ffee9e09a50class : 0x7ffee9e09a54```보다시피 둘 다 지역변수로..
[C++] 다양한 mutex, lock 중 뭘 써야하나.
[C++] 다양한 mutex, lock 중 뭘 써야하나.
2018.09.13그냥 락 거는 것 보다, 다음 API들을 사용하는게 좋다. 스코프를 벗어나면 자동으로 해제되는 lock을 걸기 위해서는 (since C++ 17 || boost)```cpp#include std::mutex mutex1;std::mutex mutex2;std::scoped_lock lock(mutex1, mutex2);// lock.unlock();```이는 ``cpp std::lock_guard``에 여러 mutex들을 한번에 lock할 수 있는 기능을 추가한 완전한 상위 호환 API다. mutex 하나 넘길 때도 퍼포먼스 걱정 안해도 된다고 함. 다양한 기능을 지원하는 unique_lockhttps://github.com/CppKorea/CppConcurrencyInAction/wiki/Chapter..
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
2018.09.12결론부터 말하자면 없어진다.함수들이 전후 호출 순서 종속성이 생기는 경우 생성자에서 처리하는게 깔끔하다. 생성자에서 처리 안하고 ``c f1()`` 호출하고 ``c f2()`` 호출하는 식이면, 이 호출 순서를 강제할 수 없으니 ``c f2()``에서 내부에 종속성 변수가 ``c NULL``인지와 같이 잘 초기화되었는지 체크해주는 루틴이 들어가 줘야 한다. 생성자는 리턴이 안되니 exception 처리가 애매한 부분이 있었으나 throw하면 없어진다고 하니 그냥 생성자에서 초기화해주는게 좋을 것 같다. https://kldp.org/node/48121 C++ Standard 15.2Quote:An object that is partially constructed or partially destroyed ..
[C++] thread는 context가 필요하다.
[C++] thread는 context가 필요하다.
2018.09.11전역 함수를 threadMain으로 지정해 실행하는건 그냥 다른 언어 처럼 하면 되는데, 객체의 메서드를 threadMain으로 지정하는건 몇 가지 신경써야 할 부분이 있다.보통 다른 언어 같으면, `` Thread`` 클래스 상속받아서 ``c t.run()`` 해주면 끝인데, C++은 그렇지 못하다. 구식 방법원래 클래스 내부의 메서드를 threadMain으로 지정하기 위해서는, threadMain가 될 메서드를 static으로 빼고,static 메서드는 클래스 내부의 일반 멤버에 접근하지 못하기 때문에 일반 메서드의 wrapper처럼 사용하고, 진짜 _threadMain은 일반 메서드로 구성한 다음, 그 일반 메서드를 호출하기 위해threadMain 메서드에서 ``c void*`` 형을 인자로 받은 ..
[C++] lambda (bind 보다는 lambda를 쓰자)
[C++] lambda (bind 보다는 lambda를 쓰자)
2018.09.03lambda가 왜 필요하냐면,함수 포인터는 함수이기 때문에 상태를 가질 수 없다.반복문 같은데 인자로 함수를 넘겨야 하는 상황에서 그 함수가 상태를 가져야 하는 경우, 함수 포인터를 사용할 수 없다.따라서 상태를 가지는 함수를 만들기 위해서 함수 객체라는 트릭을 사용해야 했다.함수 객체는 객체인데, ``cpp operator()``를 오버로드해서 함수처럼 호출할 수 있는 객체를 의미한다. Function object는 보통 Functor라고 부른다.```cppstruct Functor { void operator()() { std::cout
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
2018.09.03``cpp vector``가 있을 때, `` cls.value``들만 뽑아내고 싶은 경우가 빈번하게 있다.일반적인 경우 그냥 반복문 돌면서 처리해주면 되지만,라이브러리 등을 사용할 때는 반드시 `` cls.value``로 이루어진 iterator를 넘겨야만 하는 경우가 있다. 이런 경우 처음으로 드는 생각은 함수형의 ``cpp filter()``인데, 이는 copy가 발생하게 된다.copy 없이 `` cls`` 내의 멤버인 `` cls.value``들만 순회하는 iterator는 다음과 같은 방식으로 만들 수 있다. boost::transform_iterator내부적으로 정확히 어떻게 동작하는건지는 찾아보지 않았지만, 첫 번째 인자로 지정된 iterable의 원소를 하나 씩 꺼내서 두 번째 인자로 지정된..