msvc는 특별한 설정을 하지 않으면 /std:c++가 설정돼있든 말든 __cplusplus 값이 199711L로 predefine 되어 있습니다.

20년간 이걸 뭐 바꿀 방법이 없었다고 하는데.. 이제 컴파일러 옵션을 설정하면 __cplusplus 값을 C++ 표준에 맞게 predefine 할 수 있습니다. (마이크로소프트 devblog 'MSVC now correctly reports __cplusplus' 게시물 참조)

그냥 기본값으로 설정좀 해주면 안되나? 번거롭네요.

 

 

일단 설명에 앞서서 __cplusplus는 뭘까요?

N3936 §16.8 Predefined macro names [cpp.predefined]

1 The following macro names shall be defined by the impletation:
  __cplusplus
    The name __cplusplus is defined to the value 201402L when compiling a C++ translation unit.

C++14 표준 문서(의 마지막 draft인 N3936)를 보면 __cplusplus를 201402L로 정의하라고 되어 있습니다. C++ 표준이 바뀔 때마다 이 값도 바뀝니다

  • C++03: 199711L
  • C++11: 201103L
  • C++14: 201402L
  • C++17: 201703L

 

 

__cplusplus를 define 하려고 하면 나오는 warning C4117

대충 #define 하면 되지 않을까요? 아쉽게도 안됩니다.

__cplusplus의 값을 바꾸려면 컴파일러 옵션에 /Zc:__cplusplus를 추가하고 /std:c++ 설정을 해줘야 합니다.

옵션 두개를 모두 설정해줘야 __cplusplus 값이 정상적으로 설정됩니다.

 

 

(1) /Zc:__cplusplus switch 설정

프로젝트 속성 - 구성 속성 - C/C++ - 명령줄(command line) 추가 옵션에 /Zc:__cplusplus를 입력합니다.

 

 

(2) /std:c++ switch 설정

프로젝트 속성 - 구성 속성 - 일반 - C++ 언어 표준을 쓸 C++ 표준에 맞게 바꿔줍시다. 기본값은 C++14입니다.

C++98, 03, 11의 c++ switch는 제공하지 않을 거라고 하네요.

 

 

빌드했는데 대충 에러가 겁나 많이 뜨면 #define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING을 써줍니다

이러면 완료입니다. __cplusplus의 값을 한번 확인해보세요!

 

반응형