C++程序中的输出编译器版本
Output Compiler Version in a C++ Program
我正在编写一个程序,在编译代码时需要编译器版本的信息。
为了简化问题,我的代码有点像
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
cout<<"The C++ compiler version is: "<<__STDC_VERSION__<<endl;
return 0;
}
我预计一旦它被编译并运行,它就会输出:
C++编译器版本为:gcc 5.3.0
我试图编译它,但得到了一个错误:
$ g++ main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:24:11: error: ‘__STDC_VERSION__’ was not declared in this scope
cout<<__STDC_VERSION__<<endl;
^
如何在我的代码中正确地获得编译器版本?
我曾经使用过这样的代码:
std::string true_cxx =
#ifdef __clang__
"clang++";
#else
"g++";
#endif
std::string true_cxx_ver =
#ifdef __clang__
ver_string(__clang_major__, __clang_minor__, __clang_patchlevel__);
#else
ver_string(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
#endif
其中ver_string
被定义为:
std::string ver_string(int a, int b, int c) {
std::ostringstream ss;
ss << a << '.' << b << '.' << c;
return ss.str();
}
还有另一个有用的宏(在gcc和clang上):
__VERSION__
此宏扩展为一个字符串常量,用于描述正在使用的编译器的版本。你不应该依赖它的内容有任何特定的形式,但它至少可以包含发布号。
请参阅gcc在线文档。
如果你需要处理MSVC和其他可能性,你将不得不检查他们使用的宏,我不记得他们马上。
如果出于某种原因,我们在项目中使用Boost库,我们可以使用#include <boost/config.hpp>
中定义的宏。
以下代码:
std::string get_compile_version()
{
char buffer[sizeof(BOOST_PLATFORM) + sizeof(BOOST_COMPILER) +sizeof(__DATE__ )+ 5];
sprintf(buffer, "[%s/%s](%s)", BOOST_PLATFORM, BOOST_COMPILER, __DATE__);
std::string compileinfo(buffer);
return compileinfo;
}
to std::cout在我的机器上打印以下内容:
[Win32/Microsoft Visual C++ version 14.1](May 10 2019)
此处列出了其他相关的宏。
__STDC_VERSION__
是C标准库的版本。它不是C++的一部分,也不是编译器的版本。
来自GCC文件:
如果使用了传统的cpp选项,则不会定义此宏,也不会编译C++或Objective-C时。
它相当于__cplusplus
,它将告诉您编译器使用的C++标准版本。
编译器版本宏是特定于供应商的,对于GCC,它们是__GNUC__
、__GNUC_MINOR__
和__GNUC_PATCHLEVEL__
对于MSVC,以下代码:
#ifdef _MSC_VER
std::to_string(_MSC_VER)
#endif
可以使用。
相关文章:
- CMake 库链接使用两个不同的编译器版本
- 我的设备上的 C++ 编译器版本是什么
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- 是否根据编译器版本有条件地包含源文件
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- 在Travis中为CMAKE构建指定编译器版本
- Apple Clang编译器版本架构架构
- 功能模板与Variadic模板过载:Intel C 编译器版本18产生的结果不同于其他编译器.英特尔是错误的
- Boost bjam 不会将编译器版本放在文件名中
- 具有C 接口的C 动态库如何在不同的编译器版本之间不会破坏ABI
- 不同编译器版本的C++中的奇怪行为(字符串通过引用传递):参见简单的程序说明
- 在不同的编译器版本中调用new[]和delete[]
- 具有状态的Microsoft编译器版本19.16.27024.1的问题
- Node.js C 插件开发的编译器版本
- unix中的C 编译器版本
- Solaris 上的 GNU gcc/g++ 编译器版本,支持 C++11/14
- 区分 VC++ 2010 和更高版本的编译器版本
- VisualStudio 优化编译器版本 19.00.23506.0 中存在明显的编译错误
- 混合使用不同编译器版本构建的二进制文件
- 共享内存段在提升版本和编译器版本之间是否兼容