clang 在 macOS 中编译到哪个版本的 c++?
clang compiling to which version of c++ in macOS?
#include <iostream>
#include <vector>
using namespace std;
int main()
{
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
vector<int> a;
a.push_back(3);
vector<int> b = move(a);
}
据我所知,“移动语义”是 c++11 的一部分
输出(使用没有任何标志的 clang++ 命令编译时):
C++98
那么移动语义是如何工作的?
我知道我可以 select 我想使用 -std=c++xx 标志编译的特定版本的 c++,但这不是我想要的。
我想知道,clang 在 macOS 中编译成的默认 c++ 版本是什么?
我的 clang 正在编译的默认版本也是 c++98,c++98 中也存在 move() 函数,但显然它不执行移动语义(即创建右值引用),但只是深度复制。
以下 link 给出了找出编译器编译到哪个版本的 c++ 的答案:
这里是 link 对什么是 c++98 中的 move() 的回答:
clang 有一个选项可以指定您要使用的 C++ 版本:- std=xxx.
就像gcc一样,你可以索要ISO或GNU版本。例如:
c++98
c++03
ISO C++ 1998 with amendments
gnu++98
gnu++03
ISO C++ 1998 with amendments and GNU extensions
好像 clang 默认使用 GNU 风格:
The default C++ language standard is gnu++14.
gcc 也是如此。
您的编译器可能默认使用 gnu98,这意味着您的 C++ 版本确实是 C++98 (== C++03),但扩展提供了额外的功能,例如 std::move
。
你可以去compiler explorer and test the following code:
#include <iostream>
int main() {
std::cout << __cplusplus;
}
使用 -std=gnu++98
使用 x86-64 clang 11.0.0 编译,程序输出:
199711
如果使用了 ISO 或 GNU 版本,你可以从你的代码中检查,感谢 STRICT_ANSI macro:
Differences between all c* and gnu* modes:
c* modes define “STRICT_ANSI”.
(...)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
vector<int> a;
a.push_back(3);
vector<int> b = move(a);
}
据我所知,“移动语义”是 c++11 的一部分
输出(使用没有任何标志的 clang++ 命令编译时): C++98
那么移动语义是如何工作的?
我知道我可以 select 我想使用 -std=c++xx 标志编译的特定版本的 c++,但这不是我想要的。
我想知道,clang 在 macOS 中编译成的默认 c++ 版本是什么?
我的 clang 正在编译的默认版本也是 c++98,c++98 中也存在 move() 函数,但显然它不执行移动语义(即创建右值引用),但只是深度复制。
以下 link 给出了找出编译器编译到哪个版本的 c++ 的答案:
这里是 link 对什么是 c++98 中的 move() 的回答:
clang 有一个选项可以指定您要使用的 C++ 版本:- std=xxx.
就像gcc一样,你可以索要ISO或GNU版本。例如:
c++98
c++03
ISO C++ 1998 with amendments
gnu++98
gnu++03
ISO C++ 1998 with amendments and GNU extensions
好像 clang 默认使用 GNU 风格:
The default C++ language standard is gnu++14.
gcc 也是如此。
您的编译器可能默认使用 gnu98,这意味着您的 C++ 版本确实是 C++98 (== C++03),但扩展提供了额外的功能,例如 std::move
。
你可以去compiler explorer and test the following code:
#include <iostream>
int main() {
std::cout << __cplusplus;
}
使用 -std=gnu++98
使用 x86-64 clang 11.0.0 编译,程序输出:
199711
如果使用了 ISO 或 GNU 版本,你可以从你的代码中检查,感谢 STRICT_ANSI macro:
Differences between all c* and gnu* modes:
c* modes define “STRICT_ANSI”.
(...)