Мой английский плохой, и я прошу прощения за языковые ошибки и опечатки, если таковые имеются.
Если #ifdef не должен переносить вызов макроса, есть решение, не столь изящное.
г ++ только:
Вы можете попробовать это в отдельных случаях. Но если в a или b есть запятые, обходные пути все еще нужны.
Он просто основан на том факте, что __cplusplus определен как «1» в среде C ++ и остается сам, а не -
#define SELECT1(a, b) a
#define SELECT__cplusplus(a, b) b
#define xcat(a,b) a##b
#define concat(...) xcat(__VA_ARGS__)
#define C_OR_CPP(C, CPP) concat(SELECT, __cplusplus)(C, CPP)
C_OR_CPP(1, 2)
Другие среды
Проверьте макрос __cplusplus: компилятор, соответствующий стандарту C ++, должен сгенерировать
#define __cplusplus value
и значение должно> = 199711L