我正在编写一个程序,在编译代码时需要编译器版本的信息。
为了简化问题,我的代码就像
#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;
^
如何在我的代码中正确获取编译器版本?
答案 0 :(得分:7)
我曾经使用过这样的代码:
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 online docs。
如果你需要处理MSVC和其他可能性,你将不得不检查他们使用的宏,我不记得它们。
答案 1 :(得分:2)
__STDC_VERSION__
是C标准库的版本。它不是C ++的一部分,也不是编译器的版本。
来自GCC的文档:
如果使用-traditional-cpp选项,则不定义此宏 在编译C ++或Objective-C时。
它的等价物是__cplusplus
,它会告诉你编译器使用的C ++标准版本。
编译器版本宏是供应商特定的,对于GCC,它们是__GNUC__
,__GNUC_MINOR__
和__GNUC_PATCHLEVEL__
答案 2 :(得分:0)
对于MSVC以下代码:
#ifdef _MSC_VER
std::to_string(_MSC_VER)
#endif
可以使用。
答案 3 :(得分:0)
如果由于某种原因我们在项目中使用了Boost library,则可以使用#include <boost/config.hpp>
中定义的宏。
以下代码:
std::string get_compile_version()
{
char buffer[sizeof(BOOST_PLATFORM) + sizeof(BOOST_COMPILER) +sizeof(__DATE__ )+ 3];
sprintf(buffer, "[%s/%s](%s)", BOOST_PLATFORM, BOOST_COMPILER, __DATE__);
std::string compileinfo(buffer);
return compileinfo;
}
到std :: cout在我的机器上打印以下内容:
[Win32/Microsoft Visual C++ version 14.1](May 10 2019)