c++macrosundef

undefine and redefine the __cplusplus macro


I want to undefine and redefine the __cplusplus macro am getting however compilation error:__cplusplus was not declared in this scope

#define TEMP_VERSION __cplusplus // temporary macro to hold the __cplusplus  containt
#undef __cplusplus
#define __cplusplus TEMP_VERSION  // redefine __cplusplus

#define AA 111
#undef AA
#define AA 111

int main()
{
    cout << "__cplusplus = "<<__cplusplus<<endl; // It doesn't work
    cout << "AA = "<<AA<<endl; // It works

    return 0;
}

I know that this is really ugly but the reason why am undefining the macro is that I am using a third party Software where they are missusing the #ifdef __cplusplus, I mean the content of the #ifdef __cplusplus ... #endif is wrong. So instead of changing their software I choosed to do the following

#define TEMP_VERSION __cplusplus
#undef __cplusplus
#include <third_party_sw.h>
#define __cplusplus TEMP_VERSION

Solution

  • Question 1: Why it is not working with the __cplusplus but works with AA

    Because __cplusplus is a pre-defined macro, and behaviour of (un-)defining it is undefined:

    stadard draft [cpp.predefined]

    If any of the pre-defined macro names in this subclause, or the identifier defined, is the subject of a #define or a #undef preprocessing directive, the behavior is undefined. ...

    AA is not a pre-defined macro, nor is the indentifier reserved. It is OK to (re-)define it.


    Question 2: What do you think is it a good approach ?

    (Re-)defining reserved identifiers is never a good approach. Even redefining user defined macros is a dubious proposition.

    Ideal approach might be to fix the third party software, if possible. Alternatively, you could write a custom header for the software which doesn't have the problem.