C++ Macros – What Does the __cplusplus Macro Expand To?

c++c++11macros

  • What does the C++ macro __cplusplus contain and expand to?

  • Does the macro __cplusplus always, even in oldest C++ implementation, contain and expand to a numeric value?

  • Is it safe to use #if __cplusplus
    or should we use instead of that #ifdef __cplusplus?


Conclusion (added later)

From comments and accepted answer:

  • __cplusplus expands to a number representing the standard's version, except pre-standard C++ in the early 90s (which simply expanded to 1).

  • Yes, even in oldest C++ implementation (expands to a numeric value).

  • No, #ifdef should be used when header is shared with C-language (because some C-compilers will warn when #if checks undefined macro).

Best Answer

Yes, it always does expand to numeric value and its meaning is the version of C++ standard that is being used. According to cppreference page, __cplusplus macro should expand to:

  • 199711L (until C++11),
  • 201103L (C++11),
  • 201402L (C++14),
  • 201703L (C++17),
  • 202002L (C++20)
  • 202302L (C++23)

The difference between #if and #ifdef directives is that #ifdef should be used to check whether given macro has been defined to allow a section of code to be compiled.

On the other hand #if (#else, #elif) directives can be used to check whether specified condition is met (just like typical if-condition).