커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
338
882
3,878
3,960,872
  현재접속자 : 84 (회원 0)






배너 신청 문의

 
작성일 : 14-10-12 18:19
[QT/Win32] Qt와 C++11
 글쓴이 : devilqoo
조회 : 10,207   추천 : 1  
   http://kbdyj.tistory.com/entry/Qt-%EC%99%80-C11 [1521]
   http://www.ics.com/blog/qt-and-c11#.VDoucvl_sSw [1701]
최근 대부분의 컴파일러에서 지원하고 있는 C++11의 새로운 기능 중 Qt 에 유용한 것들을 위주로 소개하고자 한다. 따라서 모든 C++11의 항목들을 다루고 있지 않는다.

<b>C++11에 관한 내용은 전문가를 위한 C++(총2권) 이나 C++11 핵심노트등이 국내서로 출판되어 있으니 참고</b>



<b>C++11의 기능 지원하기</b>

일부 컴파일러는 C++11의 지원을 위해 명령행 옵션을 요구하기도 한다. qmake를 빌드 시스템으로 사용중이라면 프로젝트파일에 다음의 라인을 추가한다.

CONFIG += c++11

위 명령행은 Qt 5.1에서 리눅스에서 gcc, Windows에서 Visual Studio, Mac OSX 10.8에서 지원된다.
추가적으로 Qt 5.0.2에서 Mac OSX 10.8을 사용중이라면 아래 라인을 추가하여야 한다.

QMAKE_CXXFLAGS += -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7
LIBS += -stdlib=libc++ -mmacosx-version-min=10.7




<b>초기화 리스트</b>

c++11의 초기화 리스트는 QStringList 처럼 객체를 초기화 하는데 유용하다.

QStringList fruit;
fruit << "apple" << "pear" << "peach" << "tomato"

는 아래와 같이 작성할 수 있다.

QStringList fruit { "apple", "pear", "peach", "tomato" };

또한 생성자에서 상기와 같은 형태로 맴버변수를 초기화 하고자 하는 경우 초기화 리스트에서 사용이 불가능 하였지만 C++11에서는 가능하게 되었다.

MyClass::MyClass()
{
fruit << "apple" << "pear" << "peach" << "tomato";
}

이렇게 초기화 하던 것을

MyClass:MyClass() : fruit { "apple", "pear", "peach", "tomato" };
{
}


이렇게 표현이 가능하게 되었다.




<b>for 루프</b>

Qt 에서 foreach()를 이용해 for 루프를 편리하게 사용하였었다.
c++11에서는 기본 언어 기능으로 지원이 되어 사용할 수 있게 되었다.

[Qt]
QStringList options { "a", "b", "c", "d" };
foreach (const QString &option, options) {
   std::cout << qPrintable(option) << std::endl;
}

[c++11]
QStringList options { "a", "b", "c", "d" };
foreach (const QString &option : options) {
   std::cout << qPrintable(option) << std::endl;
}




<b>타입 인터페이스</b>

새로운 타입으로 auto가 추가되었다.
코드로 부터 타입을 유추하는 기능으로 특히 iterator를 선언할 때 아래의 예처럼 유용하다.

[auto 미사용 시]
   QList<MyType>::iterator iter = myTypes.begin();

[auto 사용 시]
   auto iter = myTypes.begin();

상기의 예(for 루프)는 다음처럼 표현이 가능하다.

QStringList options { "a", "b", "c", "d" };
foreach (auto option : options) {
   std::cout << qPrintable(option) << std::endl;
}

auto는 기존 c/c++에도 있던 예약어 였지만 거의 사용되지 않던 예약어였다. 하지만 c++11에서 가장 핫(?)한 예약어가 될 것으로 믿어 의심치 않는다.




<b>새로운 스타일의 connect</b>

Qt 응용프로그램은 런타임에서 connect()를 이용하여 signal/slot의 연결이 매우 많이 사용된다. Qt 개발자들 중 일부는 런타임에서 메시지를 살펴봄으로 써 signal/slot 연결에러를 찾는 방법을 알고 있었다.
디버깅할 때 Application Output창을 보면 잘못 연결된 signal/slot을 출력해준다.

하지만 C++11에서는 런타임이 아닌 컴파일 타임에 이를 체크할 수 있는 새로운 문법을 소개하였다.

connect(button, SIGNAL(clicked()), checkbox, SLOT(toggle())); // 기존 사용방법

은 다음과 같이 쓰여진다.

connect(button, &QPushButton::clicked, checkbos, &QCheckBox::toggle); // 새로운 문법 적용

기존 사용 방법의 문제점은 SIGNAL(), SLOT()에 의한 문자열 확장을 사용하기 때문에 signal과 slot함수의 인자가 서로 맞아야 하는 데 이를 컴파일 타임에 걸러낼 수 없다는 문제점이 있다.
connect(button, SIGNAL(clicked()), checkbox, SLOT(valueChanged(int))); // 잘못된 signal/slot 사용방법이지만 컴파일러는 아무런 문제 없이 컴파일 함.

새로운 스타일의 connect() 에서는 signal/slot의 이름과 인자과 컴파일 타임에 체크가 된다.
문자열이 아닌 함수명으로 직접 타입체크를 하기 때문이다.

물론 기존 형태(SIGNAL(), SLOT() 매크로에 의한 문장열로 확장형태)도 여전히 사용할 수 있다.

또한 c++11에서 람다함수를 slot함수로 사용할 수 있다.

auto mySlot = []() { qDebug() << "this is my slot."; };
connect(button, &QPushButton::clicked, mySlot);

위의 코드를 더 단축하면
connect(button, &QPushButton::clicked, [=]() { qDebug() << "This is my slot."; });

이렇게 표현 가능하다. (람다식 만세)
눈치 챘는지 모르겠지만 람다식을 사용하면 더 이상 slot()함수를 별도로 선언하여 작성하지 않아도 된다.




<b>Threads</b>
C++11에서는 이제 언어차원의 쓰레드와 컨커런트 프로그래밍을 지원한다. 그래픽 관련 코드가 아니라면 이제 언어에서 제공되는 쓰레드와 컨커런트 프로그래밍을 사용하여 이식성을 높일 수 있다.




<b>정규식 표현</b>
C++11의 standard library에서 정규식 표현을 지원한다. Qt5 에서 지원하는 QRegularExpression(Qt4 에서는 QRegExp) 클래스만큼 포관적이진 않지만 thread의 경우처럼 이식성이 중요하고 기능이 사용하기에 충분하다면 사용하는 것이 좋을 것이다.




<b>nullptr 상수</b>
c++11에서는 0, NULL 대신으로 사용하도록 nullptr이라는 새로운 키워드를 추가하였다. 간단한 수정으로 기존값이 묵시적으로 원치않는 형변환이 일어나는 문제를 피할 수 있게 해준다.

[사용예]

char *pc = nullptr; //OK
int *pi = nullptr; //OK
bool bp = nullptr; // OK, nullptr은 flase로 변환
int i = nullptr; // Error, nullptr은 int로 형변환 되지 않음




<b>Right Angle Bracket</b>
템플릿을 사용할 때 '>' 브라켓을 사용하게 되는 데 간혹 연속으로 사용 시 ">>"로 컴파일러가 인식을 하여 에러가 내는 경우가 많아 기존에는 아래와 같은 우스꽝 스런 코드를 사용했었다.

QList<QMap<QString, int> > list;

컴파일러가 충분히 문맥상으로 판단이 가능하지만 (왜 이걸 기존에 문법적으로 에러 처리했는지는 이해가...) 에러 처리 되었던 걸 c++11에서는 이제 당당하게 템플릿에서 >>을 사용할 수 있게 되었다.

QList<QMap<QString, int>> list;




<b>새로운 문자열 리터럴</b>

c++11에서는 세가지 새로운 유니코드 인코딩 포멧과 raw 인코딩이 추가되었다. raw 인코딩은 문자열 내의 '\'을 이스케이프 문자로 인식하는 것이 아니라 그대로 '\'로 인식한다.

QString s1 = "foo";
QString s2 = R"(foo\bar)";
QString s3 = u8("foo");
QString s4 = u8R"(foo)";
QString s5 = QString::fromUtf16(reinterpret_cast<const ushort *>(u"foo")); // UTF-16
QString s6 = QString::fromUtf16(reinterpret_cast<const ushort *>(uR"(foo)")); // UTF-16 raw
QString s7 = QString::fromUcs4(reinterpret_cast<const uint*>(U"foo"));  // UTF-32
QString s8 = QString::fromUcs4(reinterpret_cast<const uint*>(UR"(foo)")); // UTF-32




<b>long long 타입</b>
long long 타입이 c++11에서 정식으로 도입되었다. (64비트 이상의 데이터 형)
더이상 이식을 위해 qlonglong을 사용하지 않아도 된다.




<b>새로운 STL 컨테이너</b>
c++11은 새로운 컨테이너들을 소개하였다. array, foward_list, unordered_map, unordered_multimap, unordered_set, unordered_multiset 등이 그것들인데 Qt 컨테이너들을 사용해도 괜찮지만 이식성을 고려해 이것들을 사용할 수도 있다.



원문 출처 : <A HREF="http://www.ics.com/blog/qt-and-c11#.VDoucvl_sSw" TARGET='_blank'>http://www.ics.com/blog/qt-and-c11#.VDoucvl_sSw</A>;
Qt !!!



인라이… 14-10-13 09:20
 
감사합니다
harunene 17-07-24 15:04
 
람다식 만세!
 
 

Total 220
번호 제   목 글쓴이 날짜 조회 추천
220 자신이 해야 할 일을 결정하는 사람은 세상에… rqyuspv875 10-21 5 0
219 산다는것 그것은 치열한 전투이다. -로망로랑… rqyuspv875 10-21 3 0
218 인간의 삶 전체는 단지 한 순간에 불과하다 . … rqyuspv875 10-21 3 0
217 source 삶이 그대를 속일지라도 슬퍼하거나 노… rqyuspv875 10-21 3 0
216 내일은 내일의 태양이 뜬다 피할수 없으면 즐… wyltqme425 10-20 9 0
215 인생이란 학교에는 불행 이란 훌륭한 스승이 … wyltqme425 10-20 6 0
214 최고에 도달하려면 최저에서 시작하라.-P.시… wyltqme425 10-20 2 0
213 해야 할 것을 하라. 모든 것은 타인의 행복을 … wyltqme425 10-20 3 0
212 평생 살 것처럼 꿈을 꾸어라.그리고 내일 죽… wyltqme425 10-20 10 0
211 이룰수 없는 꿈을 꾸고 이길수 없는 적과 싸… wyltqme425 10-20 7 0
210 만약 우리가 할 수 있는 일을 모두 한다면 우… wyltqme425 10-20 16 0
209 꿈을 계속 간직하고 있으면 반드시 실현할 때… wyltqme425 10-20 7 0
208 사막이 아름다운 것은 어딘가에 샘이 숨겨져 … wyltqme425 10-20 4 0
207 자신의 본성이 어떤것이든 그에 충실하라 . … wyltqme425 10-20 3 0
206 아래에 비교하면 남음이 있다.-명심보감[쇼미… wyltqme425 10-20 7 0
205 nephew 삶이 있는 한 희망은 있다 -키케로유혜… wyltqme425 10-20 7 0
204 고통이 남기고 간 뒤를 보라! 고난이 지나면 … rqyuspv875 10-20 7 0
203 진짜 문제는 사람들의 마음이다.그것은 절대… rqyuspv875 10-20 9 0
202 지금이야 말로 일할때다. 지금이야말로 싸울… rqyuspv875 10-20 6 0
201 도저히 손댈 수가 없는 곤란에 부딪혔다면 과… rqyuspv875 10-20 19 0
200 우선 무엇이 되고자 하는가를 자신에게 말하… rqyuspv875 10-20 9 0
199 longer 자신감 있는 표정을 지으면 자신감이 생… rqyuspv875 10-20 3 0
198 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 3059 0
197 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 4758 0
196 [QT/X11] QWT for qt android (1) 구름님 03-07 6311 1
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 10251 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5872 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5738 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 6070 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 20192 1
 1  2  3  4  5  6  7  8  


About korone.net | Copyright 2003 korone.net. All rights reserved.