为什么这个 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
.
您的代码不正确(调用 atoi
传递了 std::string
实例,而函数需要 const char *
实例)并且它不应该干净地编译。学会始终启用所有警告并学会理解它们的含义。
然而,问题中所述的内容确实可以在 C++ 中发生,原因是 "undefined behavior"。
在大多数情况下,当您在 C++ 程序的运行时做错事情时,发生的事情是完全不可预测的;它可能会崩溃(如果你很幸运),它可以为你提供无意义的结果(如果你有点幸运)或者尽管你有错误它仍然可以正常工作(最危险但常见的情况)。当然,行为可以根据编译器、OS、月相变化。
适用于 C++ 的墨菲定律告诉我们,在您测试程序时,一切都会正常运行,但当您在大屏幕上向一大群人展示程序时,它会 fail miserably包括你的老板和 parents :-)
我为 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
.
您的代码不正确(调用 atoi
传递了 std::string
实例,而函数需要 const char *
实例)并且它不应该干净地编译。学会始终启用所有警告并学会理解它们的含义。
然而,问题中所述的内容确实可以在 C++ 中发生,原因是 "undefined behavior"。
在大多数情况下,当您在 C++ 程序的运行时做错事情时,发生的事情是完全不可预测的;它可能会崩溃(如果你很幸运),它可以为你提供无意义的结果(如果你有点幸运)或者尽管你有错误它仍然可以正常工作(最危险但常见的情况)。当然,行为可以根据编译器、OS、月相变化。
适用于 C++ 的墨菲定律告诉我们,在您测试程序时,一切都会正常运行,但当您在大屏幕上向一大群人展示程序时,它会 fail miserably包括你的老板和 parents :-)