验证我的编译器是否符合 c++14 的最简单的 C++ 示例?
Simplest C++ Example to verify my compiler is c++14 compliant?
我下周要参加 class C++11/14,需要验证我的设计工具是最新的并且可以实际编译 C++11/14。
我可以将最简单的代码段放在一起以验证我是否可以在我的 Linux 盒子上实际编译和执行 C++11/14 代码?我知道我需要 GCC 4.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";
}
如果这确实有效,那么您的设置是正确的:D 希望这对您有所帮助
您最初可以使用 -std=c++14
进行编译。如果您的 gcc(或 clang)不兼容 c++14,那么编译将失败(由于未知标志):
g++: error: unrecognized command line option '-std=c++14'
关于功能可用性(查询特定功能是否存在),您可以进行功能测试。可以找到一个示例文档 here :它全部归结为使用宏来测试指定功能的可用性(您还可以在其中找到 要查找的功能 ).
因此,即使您想使用多个编译器进行构建,您也可以编写这样的代码(下面是简单的示例):
#if __cpp_constexpr
constexpr
#endif
int triple(int k) { return 3*k; } // compiles with c++98 as well
这就是跨平台开发如何克服支持多个编译器及其版本的乐趣(由于标准实现速度不同,更详细的示例将显示在 gcc 中以一种方式支持某物而在 cl 中以另一种方式支持某物)
根据 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
}
对于 C++14,尝试使用 auto 作为 return 类型和 -std=c++14:
auto func(int i)
{
return [i=std::move(i)](int b){return b+i;};
}
int main()
{
int num = func(3)(5);
// use num
}
__cplusplus
宏包含编译器正在使用的 C++ 标准。每个版本的 C++ 都有一个特定的值用于此定义。这些可能(与直觉相反)与标准名称不完全匹配,因此您可以使用 gcc 来确定这些值是什么。例如:
#include <stdio.h>
int main()
{
printf("%ld\n", __cplusplus);
}
这样编译:
g++ -std=c++98 file.cpp
g++ -std=c++11 file.cpp
g++ -std=c++14 file.cpp
当运行时分别给出如下:
199711
201103
201300
如果您要查找的值不可用,您可以使用预定义的宏生成错误。例如:
#if __cplusplus < 201300
#error I require C++14 for this code, so die.
#endif
// ...
那么g++ -std=c++11 file.cpp
会编译失败
我下周要参加 class C++11/14,需要验证我的设计工具是最新的并且可以实际编译 C++11/14。
我可以将最简单的代码段放在一起以验证我是否可以在我的 Linux 盒子上实际编译和执行 C++11/14 代码?我知道我需要 GCC 4.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";
}
如果这确实有效,那么您的设置是正确的:D 希望这对您有所帮助
您最初可以使用 -std=c++14
进行编译。如果您的 gcc(或 clang)不兼容 c++14,那么编译将失败(由于未知标志):
g++: error: unrecognized command line option '-std=c++14'
关于功能可用性(查询特定功能是否存在),您可以进行功能测试。可以找到一个示例文档 here :它全部归结为使用宏来测试指定功能的可用性(您还可以在其中找到 要查找的功能 ).
因此,即使您想使用多个编译器进行构建,您也可以编写这样的代码(下面是简单的示例):
#if __cpp_constexpr
constexpr
#endif
int triple(int k) { return 3*k; } // compiles with c++98 as well
这就是跨平台开发如何克服支持多个编译器及其版本的乐趣(由于标准实现速度不同,更详细的示例将显示在 gcc 中以一种方式支持某物而在 cl 中以另一种方式支持某物)
根据 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
}
对于 C++14,尝试使用 auto 作为 return 类型和 -std=c++14:
auto func(int i)
{
return [i=std::move(i)](int b){return b+i;};
}
int main()
{
int num = func(3)(5);
// use num
}
__cplusplus
宏包含编译器正在使用的 C++ 标准。每个版本的 C++ 都有一个特定的值用于此定义。这些可能(与直觉相反)与标准名称不完全匹配,因此您可以使用 gcc 来确定这些值是什么。例如:
#include <stdio.h>
int main()
{
printf("%ld\n", __cplusplus);
}
这样编译:
g++ -std=c++98 file.cpp
g++ -std=c++11 file.cpp
g++ -std=c++14 file.cpp
当运行时分别给出如下:
199711
201103
201300
如果您要查找的值不可用,您可以使用预定义的宏生成错误。例如:
#if __cplusplus < 201300
#error I require C++14 for this code, so die.
#endif
// ...
那么g++ -std=c++11 file.cpp
会编译失败