2015-02-01 2 views
-2

나는 내 수업을 위해이 프로그램을 작성했다. GNU g ++ 컴파일러로 컴파일하고 실행하는 것으로 나타났습니다. 저의 교수님은 Microsoft Visual Studio 컴파일러를 사용하는 웹 사이트에서 프로그램을 자동 완성하여 오류가 발생합니다. 또한 BSD clang 컴파일러에서이 프로그램을 시험해 보았는데 완전히 다른 오류가 발생했습니다.이 C++ 프로그램이 일부 컴파일러에서는 작동하지만 다른 컴파일러에서는 작동하지 않는 이유는 무엇입니까? C++ 컴파일러의 주요 차이점은 무엇입니까?

#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; 

} 

는 어떻게이 모든 컴파일러 그렇게 다른 점은? 내 컴파일러에서 코드가 작동하는지 확인하기 위해 할 수있는 일이 있습니까?

+4

선택의 당신의 컴파일러를 사용하고 최대까지 그것의 경고 수준을 크랭크 방법을 배우십시오. 모든 경고를 수정하십시오. – nvoigt

+1

아, 교수님이 Visual Studio를 사용하여 코드를 확인한 사실을 알고 계시면 Visual Studio를 사용하십시오. 코드를 보내기 전에 한 번 이상. 무료입니다. 그것은 "완벽한 책 및 표준"솔루션이 아니지만 최고의 성적을 얻는 솔루션입니다. – nvoigt

+0

이것이 GCC와 함께 작동했다면 놀랄 것입니다. 어떤 버전을 사용하셨습니까? – juanchopanza

답변

1

코드가 올바르지 않습니다. 함수가 const char *을 예상 할 때 인스턴스를 std::string 전달하면 올바로 컴파일되지 않아야합니다. 항상 모든 경고를 활성화하고 그 의미를 이해하는 법을 배우십시오.

그러나 실제로 질문에 언급 된 내용은 실제로 C++에서 발생할 수 있으며 이유는 "정의되지 않은 동작"입니다.

대부분의 경우 C++ 프로그램에서 런타임에 문제가 발생하면 예측할 수 없습니다. 충돌 할 수 있습니다 (운이 좋으면), 넌센스 결과를 제공 할 수 있습니다 (운이 좋으면) 또는 오류 (가장 위험하지만 일반적인 경우)에도 불구하고 제대로 작동 할 수 있습니다. 물론 컴파일러, OS, 달의 위상에 따라 동작이 달라질 수 있습니다.

Murphy의 C++ 적용 법칙은 프로그램을 테스트 할 때 모든 것이 작동한다고 알려주지 만, 큰 화면에서 프로그램을 상영하는 무대에있을 때 상사와 상사를 포함하는 대규모 군중 앞에 프로그램이 표시 될 때 fail miserably 부모 :-)

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*)' 

를 얻을이 std::string가 자동으로 const char*로 변환되지 않기 때문에 당신이

return atoi(hold.c_str()); 

을 사용해야 나타냅니다. 언급 된 std::string::c_str() 기능이 그렇게합니다.

또한 #include <string>에 누락되었습니다. using namespace std; 대신 std::string을 명시 적으로 작성해야합니다.

여기에 compile clean version of your code이 있습니다.

+0

고마워요. 나는 그것을 어떻게 놓쳤는 지 모른다. 그렇다면 한 컴퓨터에서 프로그램을 컴파일하고 다른 프로그램에서 컴파일하지 않는 프로그램은 무엇입니까? 명시 적으로'std :: string'을 쓰면 어떤 이점이 있습니까? – ibayibay1

+1

@ ibayibay1'std ::'네임 스페이스 접두어를 명시 적으로 사용하면 전역 네임 스페이스 또는 'using'문으로 지정한 다른 함수 나 클래스 이름이있을 때 추한 네임 스페이스 충돌을 방지 할 수 있습니다. –

관련 문제