为什么这个C ++程序在不同的编译器上表现不同?

时间:2015-09-17 07:00:56

标签: c++ visual-studio-2010 c++11 g++ compiler-bug

我正在阅读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

给出的答案

1 个答案:

答案 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();
}

和它seems to work