为什么这个C ++程序在某些编译器中有效但在其他编译器中却不行? c ++编译器之间的主要区别是什么?

时间:2015-02-01 07:20:32

标签: c++ visual-c++ g++ clang compiler-specific

我已经为我的班级写了这个程序。我发现它使用GNU g ++编译器编译并运行得很好。我的教授从他的网站自动评分我们的程序,该网站使用Microsoft Visual Studio编译器,它会引发错误。我也在BSD clang编译器中尝试过这个程序,我得到了一个完全不同的错误。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;
double dec2Bin(int value, char binaryString[])
{
    int x = 1;
    string hold = "";
    while(x <= value){
        x *= 2;
    }
    x /= 2;

    while(x >= 1){
        //cout << x << " ";
        if(value > x){
            hold += "1";
            value -= x;
        }
        else if(value < x){
            hold += "0";
        }
        else if(value == x){
            hold += "1";
            value = 0;
            //return hold;
        }
        x /= 2;

        //cout << hold << endl;
    }
    return atoi(hold);

}
int main()
{
    char binstr[100];
    int num = 0;
    cout << "Enter a decimal string: ";
    cin >> num;
    cout << "its "<<dec2Bin(num, binstr) << endl;

}

是什么让所有这些编译器如此不同?有什么我可以做的,以确保我的代码可以在任何编译器中工作吗?

2 个答案:

答案 0 :(得分:5)

  

“是什么让所有这些编译器如此不同?我能做些什么来确保我的代码能在任何编译器中运行吗?”

此程序代码实际上不适用于任何c ++编译器。如果你有一个编译程序而没有抛出任何错误或警告,它有一个严重的错误(另一个怀疑可能是,你没有在这里显示你的原始代码)。

当我编译your program on Ideone时,我收到以下错误消息

prog.cpp:34:21: error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'int atoi(const char*)'

这表示您应该使用

 return atoi(hold.c_str());

因为std::string未自动转换为const char*。提到的std::string::c_str()函数就是这样做的。

你也错过了#include <string>,而不是using namespace std;,你应该更明确地写std::string

这是compile clean version of your code

答案 1 :(得分:1)

您的代码不正确(当函数需要atoi时,调用std::string传递const char *实例)并且它不应该干净地编译。学会始终启用所有警告并学习理解其含义。

然而,问题中陈述的内容确实可以在C ++中发生,原因是&#34;未定义的行为&#34;。

当你在C ++程序中运行时出错时,在大多数情况下发生的事情是完全不可预测的;它可以崩溃(如果你很幸运),它可以为你提供无意义的结果(如果你有点幸运),或者它可以正常工作,尽管你的错误(最危险但常见的情况)。当然,行为可能会根据编译器,操作系统,月球的相位而改变。

适用于C ++的Murphy法则告诉你,当你测试你的程序时,一切都会正常工作,但是当你在一个舞台上展示程序时,fail miserably会显示包括你老板和父母在内的庞大人群: - )