Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于C+,uu cplusplus的值是多少+;17?_C++_Macros_C++17 - Fatal编程技术网

C++ 对于C+,uu cplusplus的值是多少+;17?

C++ 对于C+,uu cplusplus的值是多少+;17?,c++,macros,c++17,C++,Macros,C++17,我们正在尝试在C++17及其应用程序下测试一些代码。我似乎无法让GCC提供\uu cplusplus的值: $/opt/local/bin/g++-std=c++17-dM-E-tl;dr:对于C++17,\uu cplusplus是201703L。 使用C++17时,\uu cplusplus的值是多少 根据标准草案§16.8/p1预定义宏名称[cpp.Predefined](Emphasis Mine): 以下宏名称应由实现定义: \uuuCPlusplus名称\uuuCPlusplus定义

我们正在尝试在C++17及其应用程序下测试一些代码。我似乎无法让GCC提供
\uu cplusplus
的值:

$/opt/local/bin/g++-std=c++17-dM-E-tl;dr:对于C++17,
\uu cplusplus
201703L
。 使用C++17时,
\uu cplusplus
的值是多少

根据标准草案§16.8/p1预定义宏名称[cpp.Predefined](Emphasis Mine):

以下宏名称应由实现定义:
\uuuCPlusplus
名称
\uuuCPlusplus
定义为值 编译C++翻译单元时,<>强402012L/St> 156。 156)本标准的未来版本将 将此宏的值替换为更大的值。不合规 编译器应使用最多五位十进制数字的值

但是,为C++14标准指定了相同的值。显然,C++17标准还没有正式的/standard
\uu cplusplus

在GCC版本6.1和7.0中,该值更改为201500

在Clang版本3.8和3.9中,该值保持不变201406

因此,您必须等待标准值的出现

---更新---

根据C++标准Pr.19.8/P1预定义宏名称[CPP.Prime](<强>强调矿山< /强>):

1以下宏名称应由 实施:

\uuucplusplus
整数文本201703L


因此,当使用C++17时,
\uuuuuCPlusplus
的值应为201703L

我真的不知道为什么
\uuCPlusplus
不会显示为常规宏,但我猜这是因为无法重新定义它。这就是我如何确定其值的方法

#include <iostream>
int main( int argc, char** argv )
{
  std::cout << __cplusplus << std::endl;
  return 0;
}
我会检查它是否
=201500
,而不是检查任何特定值。

我会尝试:

#if __cplusplus > 201402L
  // C++14 code here
  ...
#endif
换句话说,当编译器添加更多功能时,对大于C++14的测试应该起作用。如上所述,GCC使用
201500L
。看起来clang使用的是
201406L
(我猜是在C++14之后的四个月)


使用上面的代码片段应该是跨平台的,即使C++17为
\uuucplusplus
提供了真正的价值,它也可以工作。关于演化特征的更多细节,请尝试.< /p> 我意识到你问这个问题,引用GNU C++编译器作为你使用的编译器,但是你可能想知道Visual C++编译器上发生了什么,严格地说,你的问题并没有问到特定的编译器。 目前,截至本文发布之日,VC++2017编译器将
\uuu cplusplus
设置为
199711L
,而不是将编译器设置为使用c++17时的预期

要使其正确报告,还必须设置
/Zc:\uu cplusplus

(来源:)

为什么?好。。。用他们的话说:

我们尝试在默认情况下更新宏,发现很多 当我们更改 __cplusplus


(来源:)

通常您应该使用
\uucplusplus
define来检测c++17,但默认情况下microsoft编译器没有正确定义该宏,请参见-您需要修改项目设置以包含
/Zc:\ucplusplus
开关,或者可以使用如下语法:

#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
     //C++17 specific stuff here
#endif

现代编译时检查,您可以将其放入任何需要的文件中:

static_assert(__cplusplus >= 201703L, "This file expects a C++17 compatible compiler.");

添加开关
-xc++
(尽管它仍然可能不正确)我相信最新的标准草案仍然有旧的C++14值,因此还没有正式的值。如果您只想测试
std::uncaught_exceptions
是否可用,您应该使用
\uuuCPP\uLib\uUncaught\uExceptions
。谢谢Galik。GCC应该调用cc1plus而不是cc1。。。现在打开GCC错误跟踪器:。谢谢。我猜(这只是猜测)有些编译器不会使用
\uuucpp\ulib\uuncaught\uexceptions
。我想到了微软的VC++和SunCC。我发现
\uu cplusplus
是一个更好的测试,因为它是用一把宽大的画笔画的。然后,我可以一次性使用自己做事情的编译器,通常是VC++。就个人而言,我认为SD-6应该包括uu cpp_1998 uu cpp_2011宏,这些宏给出确切的月份和年份。还有什么更正确的呢?如果说
#if u cplusplus>=201703L
#if u cplusplus>201402L
?@alfC
#if u cplusplus>201402L
在c++1z上是真的,17,目前是2a。。。等等,但不是c++14或之前的版本。换句话说,这在2017年3月之前使用任何旧编译器时都很有用,因为您使用的是旧编译器已经提供的c++17的即用功能。当使用最新的编译器时,我更喜欢
=201703L
。201500L在c++17之前的版本中使用。所以它不会与c++14冲突,也不是一个完整的c++17编译器。。。(例如,
[[fallback]]
属性即使是半识别的,也无法正常工作。)啊,我错过了你的更新。。。我看到<代码> > C++ +STD= C++ 14 -DM -E-I,当它专门设置为C++ 17时,VisualStudio 2017不返回相同的值,VisualStudio:我在使用宏时返回了
199711
。嗯,好吧,这实际上是一个公开的bug。。。
static_assert(__cplusplus >= 201703L, "This file expects a C++17 compatible compiler.");