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

标签 c++ g++ c-preprocessor std

我正在使用 __int128 g++的扩展。 -std=c++17 的问题是某些 C++ 库没有对该扩展的所有支持(即 std::make_unsigned<> 失败)。使用 -std=gnu++17 时它工作正常。

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

#if !(<something>)
...
#endif

如果编译器已经支持 __int128 的限制.

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

最佳答案

我这样做了:

$ 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)

输出是:

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

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

因此您可以检查 __STRICT_ANSI__(表明没有 Gnu 扩展),但也许无法记录的 __GLIBCXX_BITSIZE_INT_N_0 更直接。

关于c++ - 如何在编译时区分 -std=c++17 和 -std=gnu++17 ?检查宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74242934/

相关文章:

c++ - gcc 链接器获取未使用对象的列表

c++ - 如何在 C++/openFrameworks 中的文件名字符串中使用变量 int

c++ - Visual Studio 到 gcc,代码在 gcc 中编译良好但在运行时给出 std::badalloc 错误

c++ - 为什么 std::chrono 在测量 OpenMP 并行化 for 循环和编译器优化的执行时间时不起作用?

c++ - g++ 找不到共享库

c - 在 ## 运算符中将变量名称作为参数传递

c++ - 如何从 Eclipse 内部调试外部编译的 C++ 可执行文件(设置了调试标志)?

c++ - 构造函数和g++编译配方的问题

c - 定义 = 时预处理器错误

c++ - 用于 C/C++ 代码的预处理器指令 #ifndef