为什么这个 C++ 程序在某些编译器中可以工作,而在其他编译器中却不能? c ++编译器之间的主要区别是什么?

Why does this C++ program work in some compilers but not others? What is the major difference between c++ compilers?

我为 class 编写了这个程序。我发现它在 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;

}

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

"What makes all these compilers so different? Is there anything I can do to make sure my code will work in any compiler?"

此程序代码实际上不适用于任何 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

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

然而,问题中所述的内容确实可以在 C++ 中发生,原因是 "undefined behavior"。

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

适用于 C++ 的墨菲定律告诉我们,在您测试程序时,一切都会正常运行,但当您在大屏幕上向一大群人展示程序时,它会 fail miserably包括你的老板和 parents :-)