본문 바로가기

개발 Note/C++11,14 (modern C++)

C++ 11과 C++ 99 를 동시에 지원하기 위해서 feature를 구분할 때 유용한 팁

반응형


어떻게 compiler version 에 따라 API 지원 피쳐를 구분해서 제공할까 고민하다가 compiler 를 변경해가면서 직접 값을 정리해봤습니다.

예를 들면,

c++11 부터 지원하기 시작한 매우 유용한 feature들이 있습니다.

1. final, override keyword 

2. class 선언부에서 변수 초기화 하는것


이러다 보니, c++11로 개발하고 c++99 용 모듈에서도 사용할 수 있게 할 수 없을까?

하는 아이디어( 요구사항)이 있었습니다. 사실 개발은 c++11로 하고 싶었거든요.

아니면 code를 다시 다 걷어내거나 내부 로직에서 사용하고 있는 auto, lamda등을 다 걷어내야 하는 판국이라서 말이죠.


그래서 나온 아이디어가 이렇습니다.


1. 개발은 C++11로 한다.

2. 다른 모듈에는 header file 과 so( library)를 제공한다.

3. header file만 c++11과 c++99를 구분한다.

4. 모두 해피하다.!! ㅎㅎ


여기서 3번이 문제였는데요.

먼저 확인할 사항이 몇가지 있었습니다.

1. final, override keyword에 의해서 ABI 즉,  API 호환성이 달라지는가?

2. class 선언부에서 변수 초기화가 빠졌을때 이미 compile 된 so의 동작이 달라지는가?


이 두가지를 테스트 해봤습니다.

결과는 문제가 없더군요.


이렇게 해서 C++11로 개발하고 C++99용 header(? 사실 header file 내부에서 구분해서 처리) 를 제공할 수 있게 되었습니다.


물론, c++11의 lamda 를 interface로 사용한다거, auto 를 return 값이나 parameter로 사용한다거나(이건 c++14던가요?) 하는 부분은  API class들에서는 없애야 했습니다.




이 과정에서 조사했던 유용한 정보 하나 있습니다.

바로 gcc와 llvm 에 대해서  C++11 의 지원 feature 를 확인하기 위해서  predefine 되어있는 값들을 조사 한 것인데요.

아래와 같습니다.


조사해놓고 보니까 결국 , __cplusplus 만  확인하면 끝나는 것이었더라구요. ㅠ_ㅠ


gcc 4.6

__cplusplus int 1

__GNUC__ int 4

__GNUG__ int 4

__GXX_ABI_VERSION int 1002

__GNUC_MINOR__ int 6



gcc 4.9 

__cplusplus int 201103

__GNUC__ int 4

__GNUG__ int 4

__GXX_ABI_VERSION int 1002

__GNUC_MINOR__ int 9



llvm 4.6

__cplusplus int 201103

__GNUC__ int 4

__GNUG__ int 4

__GXX_ABI_VERSION int 1002

__GNUC_MINOR__ int 6

__clang__ int 1

__clang_major__ int 3

__clang_minor__ int 4



llvm 4.9

__cplusplus int 201103

__GNUC__ int 4

__GNUG__ int 4

__GXX_ABI_VERSION int 1002

__GNUC_MINOR__ int 9

__clang__ int 1

__clang_major__ int 3

__clang_minor__ int 6