检查编译器语言标准
以下程序旨在打印出您的编译器当前正在使用的语言标准名称。您可以复制/粘贴,编译并运行此程序,以验证您的编译器是否使用了您预期的语言标准。
PrintStandard.cpp 程序
#include <iostream>
const int numStandards = 7;
// C++26 stdCode是一个占位符,因为确切的代码将在标准最终确定后才能确定
const long stdCode[numStandards] = { 199711L, 201103L, 201402L, 201703L, 202002L, 202302L, 202612L};
const char* stdName[numStandards] = { "Pre-C++11", "C++11", "C++14", "C++17", "C++20", "C++23", "C++26" };
long getCPPStandard()
{
// Visual Studio在支持__cplusplus方面是非一致的(除非你设置了特定的编译器标志,你可能没有)
// 在Visual Studio 2015或更新版本中,我们可以使用_MSVC_LANG代替
// 参见 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
#if defined (_MSVC_LANG)
return _MSVC_LANG;
#elif defined (_MSC_VER)
// 如果我们使用的是较旧版本的Visual Studio,则退出
return -1;
#else
// __cplusplus是查询语言标准代码的预期方式(根据语言标准定义)
return __cplusplus;
#endif
}
int main()
{
long standard = getCPPStandard();
if (standard == -1)
{
std::cout << "Error: Unable to determine your language standard. Sorry.\n";
return 0;
}
for (int i = 0; i < numStandards; ++i)
{
// 如果报告的版本是已最终确定的标准代码之一
// 那么我们知道编译器运行的确切版本
if (standard == stdCode[i])
{
std::cout << "Your compiler is using " << stdName[i]
<< " (language standard code " << standard << "L)\n";
break;
}
// 如果报告的版本介于两个已最终确定的标准代码之间,
// 这必须是对下一个即将发布的版本的预览/实验性支持。
if (standard < stdCode[i])
{
std::cout << "Your compiler is using a preview/pre-release of " << stdName[i]
<< " (language standard code " << standard << "L)\n";
break;
}
}
return 0;
}
常见问题解决
构建或运行时问题
如果您在尝试构建此程序时遇到错误,可能是因为您的项目设置不正确。请参见0.8 —— 一些常见的C++问题,以获得一些常见问题的建议。如果这没有帮助,请从0.6 —— 安装集成开发环境(IDE)开始复习课程。
如果程序打印出"Error: Unable to determine your language standard",则您的编译器可能是非一致的。如果您使用的是流行的编译器并且情况确实如此,请在下面留下评论并提供相关信息(例如编译器的名称和版本)。
标准不匹配问题
如果此程序打印出与您预期不同的语言标准:
检查您的IDE设置,确保您的编译器配置为使用您预期的语言标准。有关如何为一些主要编译器执行此操作的更多信息,请参见0.12 —— 配置您的编译器:选择语言标准。
确保没有拼写错误或格式错误。一些编译器要求为每个项目而不是全局设置语言标准,因此如果您刚刚创建了新项目,这可能是这种情况。
您的IDE或编译器甚至可能没有读取您正在编辑的配置文件(我们偶尔会看到有关VS Code的读者反馈)。如果情况似乎如此,请查阅您的IDE或编译器的文档。
关于预览版本的问题
Q:如果我的编译器使用的是预览/预发布版本,我应该回退一个版本吗?
如果您只是学习这门语言,这并不必要。只是要知道,即将发布的语言版本的一些功能可能缺失、不完整、有缺陷,或者可能会略有变化。