2016-08-22 8 views
0

gcc로 컴파일 된 Solaris 용 이전에 작성한 프로그램과 동일한 역할을하는 VS에서 C++ 프로그램을 작성해야합니다. 포인터에 대한 cout 형식을 변경하는 방법

다음 "문제"

가 발생했습니다 : 솔라리스에서

int var1 = 42; 
int* var1Ptr = &var1; 
cout << "Address of pointer " << var1Ptr << endl; 

이 코드 반환은 0X 색인 주소 (0x08FFAFC)를 프로그래밍합니다.

내 VS 코드에서는 008FFAFC로 반환됩니다.

우리는 코드 내에서 비교 만 했으므로 지원 팀은 해당 색인 된 값을 찾는 로그에서 데이터를 추출하는 자체 도구를 가지고 있습니다. 로그에 쓸 때마다 0x 접두사를 추가하지 않고 이렇게 형식을 지정하는 방법이 있습니까?

cout << "Maybe this way: " << hex << int(&var1Ptr) << endl; 

은 내가 원했던 효과가 없습니다.

+4

Doing'int (& var1Ptr)'는'int '의 크기가'& var1Ptr'의 크기와 같은 시스템에서만 작동합니다. 게다가,'& var1Ptr'는 변수'var1Ptr'에 대한 포인터를 제공 할 것입니다.이 변수는'int **'타입입니다. 여러분이 생각하기에 포인터를 출력하려고하지는 않습니다. –

+0

뭘 원하는지 확실하지 않습니다. 0x가 있든 없든? 제로 패딩? 나는 혼란스러워. –

+0

혼란 스럽다면 솔라리스 프로그램에서 이미 0x라는 의미로 사용 된 것입니다. –

답변

3

약간의 헬퍼 클래스 : 사용자의 조작을 통해 제공

namespace detail { 

    template<class T> 
    struct debug_pointer 
    { 
     constexpr static std::size_t pointer_digits() 
     { 
      return sizeof(void*) * 2; 
     }; 
     static constexpr std::size_t width = pointer_digits(); 

     std::ostream& operator()(std::ostream& os) const 
     { 
      std::uintptr_t i = reinterpret_cast<std::uintptr_t>(p); 
      return os << "0x" << std::hex << std::setw(width) << std::setfill('0') << i; 
     } 
     T* p; 

     friend 
     std::ostream& operator<<(std::ostream& os, debug_pointer const& dp) { 
      return dp(os); 
     } 

    }; 
} 

...

template<class T> 
auto debug_pointer(T* p) 
{ 
    return detail::debug_pointer<T>{ p }; 
} 

은 우리에게이 표현 할 수 있습니다 :

int i; 
std::cout << debug_pointer(&i) << std::endl; 

얻을 것 중 하나 8- 아키텍처에 따라 16 진수 또는 16 진수 포인터 값 (내 위치는 64 비트 임) :

0x00007fff5fbff3bc 
+0

대단히 감사합니다. VS 컴파일러가 gcc와 다른 형식으로 프로그램을 반환 할 수있는 이유를 알고 있습니까? 같은 라이브러리가 포함되어 있기 때문에 –

+2

@Thorvason 표준은 형식을 지정하지 않습니다. 따라서 구현은 원하는대로 수행 할 수 있습니다. 따라서 출력 형식에 따라 프로그램이 정의되지 않은 동작을합니다. –