※ 요약


C++은 현재 표준 작업이 C++17까지 진행된 상태다. 그런데 컴파일러들마다 최신 문법 지원 상황이 제각각인데, msvc(visual studio)와 gcc 컴파일러를 사용하는 필자는 최신 버전이 나오거나 최신 문법으로 코드를 작성할때 지원 현황을 살펴보고는 한다. 독자들에게도 소개하니 필요할때마다 참고하기 바란다. 참고로 이번에 소개하는 문서는 최신 현황보다 조금 늦어질 수도 있다는 것을 염두해 두기 바란다.


최신 버전의 문법을 테스트해보고 싶다면 최신 버전의 컴파일러를 설치하는 것도 방법이지만 온라인 컴파일러를 이용하면 더더욱 좋으니 단순히 최신 문법 테스트라면 온라인 컴파일러를 이용해보기 바란다.



※ 설명


아래는 사이트에 접속하면 볼 수 있는 화면이다. 가장 최신인 C++17부터 나열되어 있으며, gcc와 Clang이 가장 많은 스펙(features)을 지원하는 것을 알 수 있다.



다음은 C++14다. 필자가 가장 자주 사용하는 Visual Studio(msvc)는 14.x은 되어야 거의 모든 것을 지원하는 것을 알 수 있다. 참고로 msvc 14는 Visual Studio 2015다.


마지막으로 C++11이다. C++11은 C++0x라고도 불렸었는데, 그 이유는 2010년이 오기 전인 01년~09년 사이에 표준 작업을 완료할 줄 알고 0x라고 불렀다가 2011년에 표준 작업이 완료되어 현재는 C++11로 불린다.





※ 요약

비주얼 스튜디오는 편집 기능으로 봤을때 최고의 IDE중 하나다. 이는 필자의 의견만이 아니고 개발자 커뮤니티(Ex. 데브피아)나 다수의 개발 툴(이클립스, vi 등)들을 사용해본 직장 동료들의 의견을 들어봐도 대부분 동의하는 의견이다. 물론 최고의 컴파일러는 아니지만 말이다. 아무튼 비주얼 스튜디오는 버전업을 함에 따라 기능이 추가되는데, 2012버전부터 추가된 서식 기능은 정말 편한 기능중에 하나로써, 소스 코드를 작성하거나 편집할때 정말 많은 도움이 된다. 항목이 많아 일일이 다 설명하지는 않겠지만 어느 정도 보고 사용해 보면 편하다는 것을 알 수 있을 것이다.


서식 기능에 대해 조금 더 추가적으로 설명하자면, 사용자가 미리 자동 완성, 들여쓰기, 줄 바꿈, 줄 추가 등에 대해 사용자 입맛에 맞게 서식을 지정 해두면 타이핑 시 자동으로 보정?해주는 기능이다. 물론 다른 편집기에는 이미 있는 기능들일 수도 있지만 대부분 C++은 지원하지 않아 비주얼 어시스트 같은 것을 써온 독자라면 환영할 만한 일이다. 더 설명하자니 손가락도 아프고 직접 기능을 사용해봐야 직관적이므로 이만 줄이도록 하겠다. 아쉬운 점으로는 디테일하게 설정할 수 없는 부분이 좀 아쉬운거 같으니 이용에 참고 바란다.




※ 서식 기능 설정 방법

먼저 비주얼 스튜디오를 실행한뒤 메뉴에서 도구->옵션을 차례대로 선택하도록 한다. 참고로 아래 소스코드는 필자가 직접 만든 컬러 추출 프로그램인 OiColorPicker라는 프로그램이다. 굳이 안 열어도 되지만 그냥 열어봤다.



옵션 창이 뜨면 텍스트 편집기 -> C/C++ -> 서식을 선택하면 된다. 사용자에 따라서 C/C++ 대신 자신이 사용하는 언어를 선택해도 되며, 필자는 C++ 개발자라 아래와 같이 선택했다. 아무튼 서식까지 왔으면 그 하위 메뉴들인 일반, 간격, 들여쓰기, 줄 바꿈, 줄 추가들을 봐보라. 간단한 설명만으로 끝나는 옵션들도 있지만 간단한 예제들로 옵션을 보여주는 항목들도 있어서 이해하기에 크게 어렵지는 않을 것이다. 


보통 다른 블로거들이라면 옵션 항목들에 대해 하나하나 친절히 설명해주겠지만 필자는 다르다. 상기의 공식 설명 사이트의 링크를 참조하면서 스스로 해보기 바란다... 화이팅+_+





※ 요약

Embarcadero社에서 판매하는 소프트웨어인 C++ Builder 10.1 Berlin STARTER EDITION과 Delphi 10.1 Berlin STARTER EDITION가 Update2 이후 무료버전으로 배포되어 소개하고자 포스팅한다. 무료버전으로 풀기전 가격은 각각 $238.70과 $310.20. 관심있는 독자는 다운받아 설치해보기 바란다. 사실 필자는 별관심이 없어 다운받지는 않았다. 필자는 Visual Studio메모장(노트패드)만 있으면 되기 때문이다.




※ 다운로드 방법

상기의 링크로 접속하면 아래와 같은 화면이 나온다. 이름과 이메일 등 간단한 정보를 입력하여 가입하고 나면 다운로드가 가능하다.



※ 요약

구글에서 제공하는 C++ 코딩 스타일 가이드다. 체계가 잘 잡힌 회사는 회사 내부에서 사용하는 코딩 스타일이 있을텐데, 없는 회사라면 참고해도 좋을 것이다. 원문은 영문이며 한국어 번역도 있지만 아무래도 최신보다 뒤떨어져 있다.


※ 링크


※ 설명

아래는 구글 C++ 스타일이다.



아래는 번역된 사이트다.


※ 요약

gcc 6.1 버전이 2016년 4월 27일 릴리즈 되었다. C++17관련하여 fold expressions, u8 character literals, extended static_assert, nested namespace definitions 등이 추가되었고, 그 밖에 많은 변경사항들이 있으므로 사이트에서 직접 확인하기 바란다. 필자는 4.8.x 버전을 이용중인데 서비스중인 서버 인데다가, gcc는 그다지 사용하지 않고 Visual Studio를 주력으로 사용하므로 업데이트 계획은 없다.

※ gcc 사이트 링크



※ 요약
std::vector의 멤버 함수인 emplace_back은 C++11부터 추가된 멤버 함수로써 push_back과 같이 vector의 요소 끝에 원소를 추가하는 함수이다. 두 함수의 가장 큰 차이점은, push_back과 같은 삽입 함수들은 삽입할 객체를 받지만 emplace_back과 같은 생성 삽입 함수는 삽입할 객체의 생성자를 위한 인자들을 받아 std::vector 내에서 직접 객체를 생성하여 삽입하므로 임시 객체의 생성과 파괴, 복사(혹은 move)를 하지 않아도 되어 성능상 더 유리하다는 것이다.
필자가 전에 작성한 push_back도 꼭 읽어보길 바란다.

※ 함수 원형

template< class... Args >

void emplace_back( Args&&... args );


emplace의 함수 원형은 하나다. push_back과 다르게 가변인자 템플릿 문법을 이용하여 가변인자를 받는다.


※ 예제

설명을 위해 아래와 같이 임시로 예제를 작성해봤다.


먼저 push_back으로 삽입을 했을때 결과이다. push_back에 삽입하기 위해 객체를 만들어 전달했고 내부적으로 또 임시객체를 만들어 아래와 같이 호출이 많아 성능상 불리하다.


emplace_back으로 삽입할 경우, 생성에 필요한 인자를 받아 내부에서 생성 삽입하므로 아래와 같이 생성자, 소멸자를 한 번씩만 호출하여 성능상 유리하다

.




※ 실제 사용예
필자가 전에 push_back으로 작성했던 코드이다. 이 코드는 CStationObj 임시 객체를 생성하고 그것을 push_back에 전달하는 걸 알 수 있으며 성능을 따져봤을때 비효율적이다.(내부적으로 CStationObj의 임시 객체가 생성되고 생성자와 소멸자도 호출되기 때문)


emplace_back은 함수 원형에서 본 거와 같이 가변 인자를 받을 수 있어서 아래와 같이 인자를 넣을 수 있으며, 받은 인자를 std::vector안에서 직접 CStationObj를 생성하므로 push_back보다 성능상 낫다.


※ 참고 사항

- push_back으로 하여도 컴파일러 내부적으로 최적화 하기 때문에 emplace_back으로 하는 것과 별차이가 없을 수 있다. 고로 개인 프로젝트가 아니라면 호환성이 더 좋은 push_back 사용이 더 나을 수도 있다.

- push_back함수로 할 수 있는 모든 것을 emplace_back으로 할 수 있다.

- push_back함수보다 emplace_back 함수가 대체로 효율적이다.(무조건적인건 아님 반대로 push_back이 더 효율적일 때도 있음)



'STL - Containers > vector' 카테고리의 다른 글

[C++ STL] std::vector - push_back  (0) 2016.02.19
[C++ STL] std::vector 주요 멤버 함수 목록  (0) 2015.11.23
[C++ STL] std::vector 개요  (3) 2015.11.10

※ 요약

std::vector의 멤버 함수인 push_back에 대한 내용이다. 멤버 함수 push_back은 vector의 끝에 요소를 추가할때 사용하는 함수며, 이번 포스팅에서는 C++03과 C++11에서의 사용방법에 대해 간단히 알아보도록 하겠다. 참고로 아래 내용은 vector의 특성을 알고 있다고 전제하고 진행하니 vector의 특성을 잘 모르면 이 게시물을 참고하기 바란다. 또 push_back과 같은 기능을 하지만 성능상 더 유리한 emplace_back에 대한 내용도 정리한게 있으니 꼭 읽어보기 바란다.

※ 함수 원형

void push_back( const T& value );
void push_back( T&& value );        //C++11

push_back의 함수 원형은 C++03때까지 하나였다가 C++11에 추가된 Move Semantics(R-Value) 개념 때문에 하나가 더 추가되서 2개다. 첫 번째는 기존처럼 값 복사를 통해 요소를 추가하고, 두 번째는 (임시)객체의 복사가 아닌 이동을 통해 요소를 추가하므로 불필요한 복사 과정을 없애 오버헤드를 줄였다. Move Semantics나 R-Value에 대해 더 알고 싶으면 이 게시물에 있는 "02. Rvalue Reference and constexpr.pdf"를 보기 바란다.

※ C++03 기본 자료형 예제

아래는 push_back을 이용해 요소를 추가하는 간단한 예제다.


아래 이미지를 보면 vecInt와 vecDouble, vecInt1에 각각 5와 6, 9, 13, 5.0, 6.0이 잘 추가된 것을 확인할 수 있다.


※ C++11 기본 자료형 예제

C++11에서는 initializer_list라는 클래스 템플릿이라는 걸 제공해주는데, 아래와 같이 컨테이너를 선언과 동시에 편하게 초기화할 수 있다. 또 달라진 점으로는 push_back(4)인데, 리터럴 상수인 4는 move semantics를 통해 T&& value를 인자로 받는 함수가 호출된다. 이전 버전의 C++이었다면 push_back( const T& value )가 호출 되었을 것이다.


아래와 같이 값이 잘 추가되었다.


※ 사용자 정의형 예제

아래 예제는 사용자 정의형(구조체나 클래스)에 대한 예제다. 위에 있는 예제들처럼 push_back에 대한 예제이며 기본 데이터형이 아닌 사용자 정의형 데이터를 추가한다는 것만 빼면 위의 예제들과 다를게 없으므로 따로 설명은 하지 않겠다.


아래처럼 값이 잘 들어갔다.



※ 예제

위의 예제들은 어디까지나 설명을 위해 급조한 예제들이고, 아래 소스는 실제 사용예이다. 아래 소스에 대해 간단히 설명하자면 select 쿼리를 날리고 조회된 데이터 행의 개수에 따라 vector의 메모리 공간을 reserve 함수를 통해 미리 예약하고 데이터를 push_back하는 예제이다. 멤버함수 reserve에 대해서는 나중에 알아보도록 하겠다.



'STL - Containers > vector' 카테고리의 다른 글

[C++ STL] std::vector - emplace_back  (3) 2016.04.15
[C++ STL] std::vector 주요 멤버 함수 목록  (0) 2015.11.23
[C++ STL] std::vector 개요  (3) 2015.11.10

 

※ 요약
윈도우 + Visual Studio 환경에서 curl 라이브러리를 빌드하여 설치 및 이용하는 방법이다.

curl이란 무엇인지, curl의 탄생 및 발전이 궁금하다면 이 링크에 가보기 바란다.


※ 공식 사이트

※ curl 라이브러리 빌드 방법
먼저 공식 사이트에서 소스를 다운받는다.

필자는 curl-7.46.0.zip을 다운 받았다. 

 

압축을 풀고 "curl-7.46.0\projects\Windows" 경로로 이동하면 아래와 같이 Visual Studio 버전 별로 폴더가 있는데, 원하는 버전으로 이동하면 된다. 필자는 Visual Studio 2013 버전(12.0) 으로 빌드할 것이다.

참고로 각 폴더별 버전은 아래와 같다.

VC10은 Visual Studio2010

VC11은 Visual Studio2012

VC12은 Visual Studio2013

VC14은 Visual Studio2015

VC15은 Visual Studio2017

 

VC12 폴더 하위에 있는 curl-all.sln파일을 오픈한다.

 

오픈하면 2개의 프로젝트가 존재한다.

 

필자는 정적(Static)으로 빌드할 것이다. 필요하면 당연히 DLL로 해도 된다. 

 

빌드를 하면 아래와 같이 성공이다.

 

"curl-7.46.0\build\Win32\VC12"로 이동하면 Debug와 Release폴더가 있고, 이동하면 libcurl.lib 파일이 존재한다.

 

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib"로 이동하여 컴파일된 libcurl.lib, libcurld.lib 파일을 복사한다.

꼭 libcurl.lib, libcurld.lib 2개 다 복사할 필요는 없다. 필요에 맞게 libcurl.lib만 복사해도 된다.

 

이번엔 헤더파일들을 복사할 차례다.

"curl-7.46.0\include"에 있는 curl 폴더를 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include" 하위에 복사해준다. 그럼 curl 사용을 위한 환경 준비는 완료다.

 

잘 설치되었는지 확인하기 위해 curl 공식 사이트에 있는 예제를 컴파일 해봤고, 오류 없이 잘 컴파일 되었다.

참고로 필자는 라이브러리를 정적으로 빌드해서 소스코드에 몇몇가지를 추가했고, 그에 대해 주석을 간단히 남겼다.

 

 

※ curl 사용

빌드시 생성된 curl.exe를 "C:\Windows\System32"에 복사시키면 아래와 같이 윈도우 콘솔에서도 사용이 가능하다.

64비트 콘솔에서 필요하다면 "C:\Windows\SysWOW64"에 복사하면 된다.



 

※ 요약
sin과 cos을 이용하여 직접 원을 그리는 방법이다.
직접 원을 그리므로 원하는 각도 만큼만 그릴수 있는데, 필자는 이를 신입때 만든 각도기 프로그램에 접목시켰다.
지금 이 예제는 Win32 API + OpenGL인데, MFC에서 GDI를 이용한 예제도 올리도록 하겠다.
또 타원 그리기 예제도 올릴것이고, 그 후에는 임의의 점이 원이나 타원에 속해 있는지 판별하는 예제도 올리도록 하겠다.
또 그후에는 타원이나 사각형 등의 도형을 직접 회전하는 예제도 올리겠다.

※ 특징
math.h에 있는 sin과 cos을 이용하여 원을 그린다.


DrawCircle2D가 원을 그리는 함수다. 배포하고 있는 프로그램이라 소스 코드의 일부만 올렸는데, 

MFC 예제를 올릴때는 전체 프로젝트를 올리겠다.

함수의 각 인자를 순서대로 설명하자면, 

원의 중심점, 시작 각도, 끝 각도, 원의 반경(반지름)이다.

각 인자의 용도를 알았으니 for문과 sin, cos을 이용하면 당장 MFC에서도 원을 그릴수 있을 것이다.

참고로 POINT는 float x, y가 멤버로 있는 구조체다.

또 아래 함수는 클래스의 멤버 함수이지만 C언어 함수로도 사용할 수 있어서 제목을 C/C++로 하였다.


아래는 위의 함수로 직접 그린 원이다.


아래는 다음 예제로 올릴 타원 그리기와 도형 회전이다.


 

※ 요약
std::forward_list의 주요 함수 목록이다.
std::forward_list의 경우는 C++11부터 추가된 컨테이너이고, 각 멤버들의 사용법은 다음 게시물부터 올리도록 하겠다.

- C++03

- C++11

 분 류

 멤버 함수

 설 명

Iterators

begin

 첫 번째 원소를 가리키는 반복자를 리턴한다.

cbegin

 첫 번째 원소를 가리키는 상수 반복자를 리턴한다.

end

 마지막 원소를 가리키는 반복자를 리턴한다.

cend

 마지막 원소를 가리키는 상수 반복자를 리턴한다.

rbegin

 제공 안 함

crbegin

 제공 안 함

rend

 제공 안 함

crend

 제공 안 함

Element access

at

 제공 안 함

operator[]

 제공 안 함

front

 첫 번째 원소의 참조를 리턴한다.

back

 제공 안 함

Capacity

empty

 원소 존재 유무를 체크한다. 아무것도 없으면 true, 있으면 false를 리턴한다.

size

 제공 안 함

max_size

 담을 수 있는 원소의 최대 개수를 리턴한다.

resize

 list의 크기를 변경하고 default 값이나 임의 값으로 초기화한다.

capacity

 제공 안 함

reserve

 제공 안 함

shrink_to_fit

 제공 안 함

Modifiers

clear

 list의 모든 원소를 제거한다.

assign

 기존 원소들은 모두 제거 후, 임의 값으로 n개의 원소를 할당한다.

insert_after

 지정된 위치에 뒤에 값을 삽입한다.

emplace_after

 원소 삽입시 컨테이너 내부에서 생성 후 지정된 위치에 뒤에 값을 삽입한다.

emplace_hint

 제공 안 함

erase_after

 지정된 위치 다음이나 지정된 위치 이후의 지정한 범위의 모든 데이터를 지운다.

push_front

 list의 처음에 원소를 추가한다.

emplace_front

 원소 삽입시 컨테이너 내부에서 생성 후 컨테이너의 처음에 원소를 추가한다.

pop_front

 list의 처음 원소를 제거한다.

push_back

 제공 안 함

emplace_back

 제공 안 함

pop_back

 제공 안 함

swap

 list1.swap( list2 )일때 list1과 list2를 swap한다.

List operations

merge

 list1.merge( list2 )일때 list1에 list2를 정렬하면서 병합한다.

splice

 2개의 list 중 인자로 주어지는 list의 지정된 원소들을 대상 list로 이동시킨다.

remove

 인자로 받은 값으로 받은 값과 같은 값의 원소를 모두 제거한다.

remove_if

 함수객체의 조건을 만족하는 원소를 모두 제거한다.

reverse

 list에 담긴 원소의 순서를 역순으로 바꾼다.

unique

 list에 담긴 원소 중 연속적으로 중복된 값이 배치된 원소를 제거한다.

sort

 list에 담긴 원소를 정렬한다. 예 : list.sort( std::greater<int>() )

Lookup

count

 제공 안 함

find

 제공 안 함

lower_bound

 제공 안 함

upper_bound

 제공 안 함

equal_range

 제공 안 함

Observers

key_comp

 제공 안 함

value_comp

 제공 안 함

hash_function

 제공 안 함

key_eq

 제공 안 함

Allocator

get_allocator

 list의 allocator 객체를 반환한다.




'STL - Containers > forward_list' 카테고리의 다른 글

[C++11 STL] std::forward_list 개요  (0) 2015.11.17

+ Recent posts