我正在阅读this。该问题包含以下程序。
#include <iostream>
#include <cstdio>
#include <string>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString);
cin.get();
return 0;
}
我试过g ++ 4.8.1&amp;它编译失败。 g ++ 4.8.1给出了以下诊断。
9 47 [Error] cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...'
9 47 [Warning] format '%s' expects argument of type 'char*', but argument 2 has type 'std::string {aka std::basic_string<char>}' [-Wformat=]
这个错误是什么意思?这个程序应该成功编译吗?哪个编译器是正确的(g ++或MSVS 2010)?为什么MSVS 2010接受此代码?在MSVS 2010上编译时,代码是否调用未定义的行为?
令人惊讶:我在使用g ++ 5.0&amp ;;的ideone上尝试过它。令人惊讶的是,它编译和放大运行正常。 (参见现场演示here.)。 g ++ 5.2.0在编译此代码时发出警告。 (参见现场演示here)。为什么它在ideone上编译好但在g ++ 4.8.1上失败? g ++ 4.8.2(给出与g ++ 4.8.1,4.9.0,4.9.1,4.9.2相同的诊断(给出错误而不是警告).g ++ 5.1.0发出警告但程序仍然编译并且运行正常。
为什么在编译上述程序时,不同版本的g ++的行为会有所不同?这是g ++中的错误吗? Clang还拒绝编译此代码以响应@TemplateRex
给出的答案答案 0 :(得分:1)
Clang错误输出“错误:无法将类型'string'(又名'basic_string')的非平凡对象传递给可变参数函数;格式字符串的预期类型为'char *'[-Wnon-pod-varargs]”并建议修复“注意:你的意思是调用c_str()方法吗?”
#include <iostream>
#include <cstdio>
#include <string>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str());
cin.get();
}