Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++;验证我的编译器是c++;14合规?_C++_C++11_Gcc_C++14 - Fatal编程技术网

C++ 最简单的C++;验证我的编译器是c++;14合规?

C++ 最简单的C++;验证我的编译器是c++;14合规?,c++,c++11,gcc,c++14,C++,C++11,Gcc,C++14,下周我要上一堂关于C++11/14的课,需要验证我的设计工具是否是最新的,是否可以编译C++11/14 为了验证我是否能够在Linux机器上编译和执行C++11/14代码,我可以编写的最简单的代码是什么?我知道我需要GCC4.9.X或更高版本,但我只想在我出现之前确保一切正常 谢谢您的帮助。为了确保它能正常工作,您可以简单地尝试编译一些仅在c++14之后才可用的代码。比如说 #include <iostream> #include <tuple> #include <

下周我要上一堂关于C++11/14的课,需要验证我的设计工具是否是最新的,是否可以编译C++11/14

为了验证我是否能够在Linux机器上编译和执行C++11/14代码,我可以编写的最简单的代码是什么?我知道我需要GCC4.9.X或更高版本,但我只想在我出现之前确保一切正常


谢谢您的帮助。

为了确保它能正常工作,您可以简单地尝试编译一些仅在c++14之后才可用的代码。比如说

#include <iostream>
#include <tuple>
#include <functional>

auto f() // this function returns multiple values
{
    int x = 5;
    return std::make_tuple(x, 7); // not "return {x,7};" because the corresponding
                                  // tuple constructor is explicit (LWG 2051)
}

int main()
{
    // heterogeneous tuple construction
    int n = 1;
    auto t = std::make_tuple(10, "Test", 3.14, std::ref(n), n);
    n = 7;
    std::cout << "The value of t is "  << "("
              << std::get<0>(t) << ", " << std::get<1>(t) << ", "
              << std::get<2>(t) << ", " << std::get<3>(t) << ", "
              << std::get<4>(t) << ")\n";

    // function returning multiple values
    int a, b;
    std::tie(a, b) = f();
    std::cout << a << " " << b << "\n";
}
#包括
#包括
#包括
auto f()//此函数返回多个值
{
int x=5;
return std::make_tuple(x,7);//不是“return{x,7};”,因为对应的
//元组构造函数是显式的(LWG 2051)
}
int main()
{
//异构元组构造
int n=1;
自动t=std::make_tuple(10,“Test”,3.14,std::ref(n),n);
n=7;

std::cout您可以使用
-std=c++14
进行初始编译。如果您的gcc(或clang)不符合c++14,则编译将失败(由于uknown标志):

关于功能可用性(查询特定功能的存在情况),您可以执行功能测试。可以找到一个示例文档:它归结为使用宏来测试指定功能的可用性(在其中您还可以找到要查找的功能

因此,即使您想使用多个编译器进行构建,也可以编写如下代码(下面是简单的示例):


这就是跨平台开发如何克服支持多个编译器及其版本的乐趣(更详细的示例将显示,由于标准实现的速度不同,在gcc中以一种方式支持sth,在cl中以另一种方式支持sth)

根据Nikos的回答,使用-std=c++11或-std=c++14标记进行编译可以确定编译器是否支持这些标准


使用C++11和C++14的小示例:

对于C++11,您可以尝试使用-std=C++11编译自动:

#include <memory>
using namespace std;

int main()
{
    auto p1 = make_shared<int>(42);
    // use p1
}

<> >代码> > pPLUS PLUS 宏包含编译器使用的C++标准。C++的每个版本对这个定义都有特定的值。这些(反直观)与标准名称不完全匹配,因此可以使用GCC确定值是什么。例如:

#include <stdio.h>
int main()
{
   printf("%ld\n", __cplusplus);
}
#if __cplusplus < 201300
#error I require C++14 for this code, so die.
#endif
// ...
运行时分别给出以下内容:

199711
201103
201300
如果要查找的值不可用,则可以使用预定义宏生成错误。例如:

#include <stdio.h>
int main()
{
   printf("%ld\n", __cplusplus);
}
#if __cplusplus < 201300
#error I require C++14 for this code, so die.
#endif
// ...
\if\uu cplusplus<201300
#错误:我需要C++14来编写这段代码,所以去死吧。
#恩迪夫
// ...

然后
g++-std=c++11文件.cpp将无法编译。

你能用
-std=c++14
编译吗?这是我能得到的最简单的了!
int main(){} >我只需要添加标志,所有的东西都可以,没有必要在其中添加一个C++ 11/14特性吗?@它确实可以有编译器错误,但是我觉得如果你可以用这个标志编译,你所用的编译器支持C++。14@NikosAthanasiou谢谢你的编辑。谢谢。这是我一直在寻找的。我有o idea异构元组构造是14个功能!(我以为是11)感谢insight=)看不到此代码中使用的任何c++14特定功能。c++11标准足以正确编译它。@Alejandro我现在不再确定:-(…
make_tuple()
很可能是前面提到的c++14(我第一次没有发现它)在某些情况下,c++11中似乎也有make_tuple()支持。因此,我稍微(自动返回)修改了我的答案以保持确定。感谢您的注意。我知道了!感谢您将其作为答案=)执行一个
gcc--version
,并查看clang和@Alex的相同操作,这是一个好方法。尽管它可以在单机或单机上运行“一个工具工具链”。如果您正在构建多个编译器(或者如果计划支持多个编译器),则需要进行功能测试。例如:我希望尽可能支持右值引用,但不中断旧编译器的编译;一个解决方案是将代码放入
#If_ucpp_右值引用
(链接中描述了几乎所有需要的宏)。最酷的是,这样的宏可以跨越cl(microsoft)之间的界限gcc/clangI认为OP想知道他的机器和他工作的机器。没有必要在教室里进行功能测试宏,因为OP不会编写需要在多个编译器上运行的代码,而是需要在分级计算机上运行的代码。他的代码是否会提交到任何野生代码库(即boost)功能测试是一种可行的方法(事实上这是一个很好的解决方案)。并不是每个编译器都支持SG10功能测试宏。例如,MSVC没有计划实现它们。标准遵从性需要不止一个功能。它要求编译器/库实现整个标准。测试(或@yakk's)后您可以说的就是是的,你们有一个实现了一些标准的编译器。@rici是的,我编辑了答案以避免误解。
199711
201103
201300
#if __cplusplus < 201300
#error I require C++14 for this code, so die.
#endif
// ...