postgame

신박한 c++20 1/2

review/major 2020. 12. 17. 12:06

현재(2020년 12월) c++20은 아직 완료된 단계가 아닙니다.

하지만 vs2019에서도 20의 일부 기능을 사용할 수 있어요.

 

저도 정리하는겸, 

c++20에서 추가되거나 검토중인 기능들을 몇개씩 일부 소개해보겠습니다. 

17부터 해야겠지만, 신기한 20부터...

일단 vs2019에서 아래 옵션을 적용하면 20의 일부 기능을 사용할 수 있습니다. 물론 안되는것도 꽤 있습니다.

 

프로젝트 속성 페이지 -> 일반 -> c++ 언어 표준 -> 미리보기 = 최신 c++초안의 기능(/std:c++latest)

프로젝트 속성 페이지 -> C/C++ -> 고급 -> 컴파일 옵션 -> C++ 모듈 코드로 컴파일(/interface)

프로젝트 속성 페이지 -> 언어 -> C언어 표준 => ISO C17(2018) 표준(/std:c17)

프로젝트 속성 페이지 -> 언어 -> STL용 C++ 모듈 사용(실험적) => 예(/experimental:module)

프로젝트 속성 페이지 -> C/C++ -> 코드 생성 -> 런타임 라이브러리 -> 다중 스레드 DLL(/MD) 

(/MD는 std.core를 위해 필요합니다. 다만 아직 경고가 발생합니다.)

 

1. 모듈

 

무려 자바나 c#에서와 같은 import가 생겼습니다.

심지어 #include 와 import를 동시에 쓸수 있습니다. 사이버펑크의 시대가 오는거죠.

 

c++은 전통적으로 헤더파일로 링크를 겁니다.

#include "test.h" 

#include "core.h"

헤더안에 헤더를 더하면 선별적 사용되는건 없고, 소스 크기가 그대로 커집니다.

빌드 시간도 기아급수적으로 늘어나고요.

고대시절 복잡하게 얽힌 헤더파일들 때문에 빌드 1시간을 넘어가던 시절도 있었습니다.

유닛테스트는 꿈도 못꾸던 시절이였죠.

 

하지만 import가 지원하면서 자바나 c#처럼 선별적으로 사용할 수 있게 되었습니다.

모듈 파일은 ixx이 확장자이고, dll을 내보내는것과 비슷합니다.

 

------------------------

Module.ixx

------------------------

export module Module;

 

export int MyFunc(int a, int b){

    return a+b;

}

------------------------

1.cpp

------------------------

import Module;

import std.core;

using namespace std;

int main()

{

    cout<<MyFunc(1,2)<<endl;

}

------------------------

 

위 옵션을 다 켰으면 #include가 없이 vs2019에서도 빌드가 가능합니다.

보심 #include <iostream>도 없어요.

물론 c++인데, 자바나 c#처럼 쉬우면 c++이 아니죠.

 

------------------------

m.ixx

------------------------

export module m;

export

int munge(int aint b) {

    return a + b;

}

------------------------

n.ixx

------------------------

export module n;

export

int munge(int aint b) {

    return a - b;

}

------------------------

1.cpp

------------------------

import m;

import n;

import std.core;

 

using namespace std;

 

int main()

{

    cout << munge(43)<< endl;

}

------------------------

 

위처럼 빌드하면 import 먼저 시킨 함수가 콜됩니다.

 

현재 모듈는 c++20에서 실험단계로, 적용된다면 완전히 #include를 대체할 수 있을 것으로 보입니다.

하지만 #include와 import가 섞이면 자연스럽게 혼파망이 될 것이기 때문에, 

조심스럽게 접근되지 않을까 싶어요.

 

============================================================================

 

2. 우주선(shaceship) 연산자

 

php에서나 보던 <=>가 c++에서도 추가되었습니다.

기능도 비슷해요.

 

(a <=> b) < 0 ==> a < b입니다.

(a <=> b) > 0 ==> a > b입니다.

(a <=> b) == 0 ==> a와 b가 같거나(equal) 동등(equivalent)하거나 입니다.

 

수학적으로 같거나(equal)와 동등(equivalent)는 다릅니다.

0.0과 -0.0은 같지않지만, 동등하죠.

 

------------------------

#include <compare>

#include <iostream>

 

int main() {

    double foo = -0.0;

    double bar = 0.0;

 

    auto res = foo <=> bar;

 

    if (res < 0)

        std::cout << "-0 is less than 0";

    else if (res == 0)

        std::cout << "-0 and 0 are equal";

    else if (res > 0)

        std::cout << "-0 is greater than 0";

}

------------------------

 

php에서는 묵시적으로 변환되는게 많기 때문에 <=>가 유용하지만, 

c++에선 연산자 재정의해서 의도적으로 사용하는 것 말고는 자주 쓰일 것 같진 않습니다.

하지만 우주선 연산자는 멋지니까 괜찮습니다. 자바는 우주선 없잖아요.

 

============================================================================

 

3. 콘셉트

 

드디어 템플릿 T에 제약을 줄 수 있는 콘셉트가 추가되었습니다.

아래는 concept 키워드로 Equal란 컨셉트를 만든 후,

제약으로 a==b, a!=b를 bool로 처리하는 템플릿만 만들겠다는 의미입니다.

 

------------------------

#include <iostream>

 

template<typename T>

concept Equal =

requires(T a, T b) {

    { a == b } -> bool;

    { a != b } -> bool;

};

 

bool areEqual(Equal auto aEqual auto b) {                     // (1)            

    return a == b;

}

 

/*

struct WithoutEqual{

  bool operator==(const WithoutEqual& other) = delete;

};

struct WithoutUnequal{

  bool operator!=(const WithoutUnequal& other) = delete;

};

*/

 

int main() {

 

    std::cout << std::boolalpha << std::endl;

 

    std::cout << "areEqual(1, 5): " << areEqual(15) << std::endl;

 

    /*

    bool res = areEqual(WithoutEqual(),  WithoutEqual());

    bool res2 = areEqual(WithoutUnequal(),  WithoutUnequal());

    */

 

    std::cout << std::endl;

}

------------------------

 

주석처럼 operator==나 operator!=를 지워버리면, 컨셉트 때문에 빌드 에러를 내줍니다.

이제야 c++ 템플릿 지정자 제약이 들어갔는데, 요 소스도 아직까진 vs에서도 빌드가 안됩니다.

곧 테스트해볼 수 있게 되면 쓸만할꺼라 생각됩니다.

 

계속

Posted by totori_


육아 관련 프로에서 오은영 박사를 비껴서 보는건 정말 어렵습니다.

정말 안나오는 곳이 없어요.

그녀는 아주 이해하기 쉬우면서도, 공감가는 이야기를 합니다.


교육이란 이름으로 폭력을 일삼았던 우리네 교육 현실이 잘못됬다는걸 

정확히 꼬집을 때는 정말 통쾌합니다.

스스로 반성하게 되는 계기가 되기도 하고요.


하지만, 책으로 읽다보면 

비슷한 이야기가 반복되고 있고,

그다지 깊이있는 이야기가 아니라는 것도 알수가 있습니다.


오은영박사는 정신과 전문의에요.

소아정신과 의사는 ADHD나 자폐아를 다루는게 일이지,

교육 전문가와는 또 다릅니다. 다른 학문이죠.


그리고 만약 전문가라도, 이론과 임상실험 결과를 토대로 

이야기를 하면 다들 질려버릴 겁니다.

딱, 소비자의 눈높이에서 원하는 이야기를 들려주고 있는거죠.


오은영박사가 잘못한다는 것은 아닙니다.

그녀에 이야기에는 들어야할 충분한 가치가 있습니다.


다만, 그녀의 말도 하나의 시각이라는 것으로 봐야합니다.


TV에서처럼 30분안에 모든 문제가 해결되면 좋겠지만,

아쉽게도 세상은 그렇게 단순하지가 않잖아요.


★★★☆☆

Posted by totori_




이 책은 필자 여러명의 토막 수필을

엮은 책입니다.


이런 책은 좋다 나쁘다를 평가하기가 어려워요.

괜찮은 내용도 있고 별볼일 없는 내용도 있죠. 

여러 명의 필자글 중 적어도 하나는 독자를 만족시킬 수 있을겁니다.

일종의 카탈로그죠.


대신 그만큼 깊이가 무척 얇습니다.

독자 눈높이에 따라 이런 책을 재밌게 읽는 사람도 있겠지만

이런 책에서 해커와 화가 같은 내용을 기대하긴 역시 무리죠.


별점평가는..

★★☆☆☆

입니다.

Posted by totori_