2012-06-11 2 views
4

HP-UX에서 Linux로 C++ 소스 코드를 이식하려고 할 때이 문제가 발생했습니다. 리눅스에서 C++ 소스 코드를 컴파일하려고하면, 표준 C++ 라이브러리의 컴포넌트가 존재하지 않는다는 불평을하게됩니다. 네임 스페이스 std를 사용하여 행 배치. 소스 코드의 상단에있는 문제를 해결하는 것 같습니다. HP-UX에서 코드를 다시 컴파일하려고하면 aCC 컴파일러는 여기서 유효한 네임 스페이스 이름 만 유효하다고 불평합니다 (std는 유효한 네임 스페이스로 간주하지 않습니다). 소스 코드가 오랫동안 사용되지 않는 HP-UX의 C++ 컴파일러와 LINUX의 GCC 컴파일러 모두와 바이너리 호환되도록이 문제를 해결할 수있는 방법이 있는지 궁금합니다.네임 스페이스 std를 사용하여 사용할 수 없게되는 방법; in C++

답변

6

이 짜증,하지만 당신은이 작업을 수행 할 수 있습니다

#ifndef __HP_aCC 
using namespace std; 
#endif 

here에서 정의, 나는 확인할 방법이 없습니다.

+0

감사합니다. 이 프로그램은 이제 aCC 및 GCC와 이진 호환됩니다! :) – Justin

0

LINUX 또는 WIN32과 같은 플랫폼 관련 상수를 사용하여 using namespace std 행을 추가하거나 삭제할 수 있습니다. 이를 수행하는 일반적인 방법은 config.h 파일을 작성하거나 (또는 ​​더 자주 생성하는) 사용하는 플랫폼 특정 유형 이름의 별명을 정의하는 것입니다.

1

당신은 당신이 정말로 #ifdef 년대를 원하지 않는 경우,이 작업을 수행 할 수 있어야한다 :

namespace std {} 
using namespace std; 

, 만들거나 std 네임 스페이스를 확장되었는지. Linux에서는 확장되어 HP-UX에서 생성됩니다. 두 경우 모두 using이 유효합니다. 대신 현대적인 스타일의

#include <iostream.h> 

:

은 HP-UX 컴파일러는 당신이 말한대로 오래된 경우

그러나, 다음의 C++ 헤더 파일을 포함한 소스 코드 가능성이 이전 스타일

#include <iostream> 

이 문제를 해결할 솔루션이있는 경우 코드에서 조건부 컴파일을 사용하고있는 것일 수 있습니다. 이러한 종류의 플랫폼 관련 결정을 이미 코드의 단일 위치에 현지화 한 경우 해당 플랫폼에 대해 using namespace std 코드 만 추가하면됩니다.

2

OS를 확인하고 사전 확인을 사용하여 namespace std을 포함할지 여부를 지정할 수 있습니다. 따라서 OS가 HP aCC가 아닌 경우 std를 포함하지 않습니다. 그렇지 않으면 std가 포함됩니다. 이렇게 :

또는 Linux를 확인하고 win을 사용하고 해당 OS 인 경우 네임 스페이스 std 만 사용하려는 경우 다음과 같이 할 수도 있습니다.

#if defined(WIN32) || defined(LINUX) 
using namespace std; 
#endif 

도움이 되었기를 바랍니다.

+0

감사합니다. 이것은 도움이되었습니다. :) – Justin

1
  1. 는 올바른 헤더를 포함하고 있는지 확인합니다. C++은 다른 표준 헤더를 포함 할 표준 헤더를 정의하지 않으므로 간접 포함을 사용하면 구현이 다르게 동작합니다. 따라서 포함시킬 내용이 모두 에 직접 포함되어 있는지 확인하십시오.

  2. using namespace std;은 사용하는 이름을 완전히 한정하지 않고 필요한 특정 구성 요소를 호출하는 using 선언을 사용하면 안됩니다.

    using std::string; 
    
        string s; // no need for using namespace std