如何在编译时区分 -std=c++17 和 -std=gnu++17 ?检查宏?

Ale*_*lke 3 c++ g++ std c-preprocessor

我正在使用__int128g++ 的扩展。问题-std=c++17是某些 C++ 库不完全支持该扩展(即std::make_unsigned<>失败)。使用时-std=gnu++17效果很好。

我添加了一个头文件,允许在使用时使用<limit>,我想暂时保留它,但是在使用时它会中断(因为它已经定义了)。所以我想添加一个这样的条件:__int128-std=c++17-std=gnu++17

#if !(<something>)
...
#endif
Run Code Online (Sandbox Code Playgroud)

如果编译器已经支持__int128.

我的问题是:我可以检查什么<something>来区分标准库和 GNU c++17 库?

ric*_*ici 7

我这样做了:

$ diff <(g++-11 -std=c++17 -E -dM -x c++ /dev/null|LC_ALL=C sort) \
       <(g++-11 -std=gnu++17 -E -dM -x c++ /dev/null|LC_ALL=C sort)
Run Code Online (Sandbox Code Playgroud)

输出是:

180a181,182
> #define __GLIBCXX_BITSIZE_INT_N_0 128
> #define __GLIBCXX_TYPE_INT_N_0 __int128
315d316
< #define __STRICT_ANSI__ 1
424a426,427
> #define linux 1
> #define unix 1
Run Code Online (Sandbox Code Playgroud)

当然,这还不是确定的,但这可能是一个开始。

所以你可以检查__STRICT_ANSI__(表明没有 Gnu 扩展),但也许未记录的__GLIBCXX_BITSIZE_INT_N_0更直接。