2011-10-14 3 views
6

디버깅 (로깅) 중에 디스플레이 멤버의 변수 이름에 매크로를 사용하여 콘솔에 출력하려고합니다. 어떻게 그럴 수 있습니까? 나는 다음과 같은 시도했지만 그것은 '일을하지 않습니다.#define에 변수 이름을 인쇄하십시오.

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl; 

int main(){ 
    int my_variable=3; 
    MY_PRINT(my_variable); 
    // I would like to print to console 
    // 'my_variable'=3 
} 
+2

"작동하지 않음"을 정의하십시오. 나는 과거에도 그렇게 많은 시간을 당신에게 말하고있었습니다. 그것은 수치 스럽습니다. –

+0

안녕 Tomalek, 아래의 응답을 참조하십시오. '#'문자를 추가하는 것만으로도 충분합니다. –

+2

예, 답변 자체가 무엇인지 압니다. 그러나 나는 당신을, 조금 늦게 훈련시켜 정확한 질문을 쓰려고 노력하고 있습니다. –

답변

17

어 ... 나는 해결책을 찾았습니다. 당신이하지 않는, 그래서 컴파일러는 데이터 유형에 따라 스트리밍 연산자를 선택

#define STR(x) #x << '=' << x 

int main() 
{ 
    int i = 1; 
    std::string str("hello"); 
    std::vector<std::string> vec; 
    my_class mc; 

    ... 

    std::cout << STR(i) << std::endl 
      << STR(str) << std::endl 
      << STR(vec) << std::endl 
      << STR(mc) << std::endl; 

    return 0; 
} 

이 방법 :

내가 C를 들어이

#define MY_PRINT(x) std::cout << #x"=" << x << std::endl 
2

같은 매크로를 작성해야 ++ 나는 이것을 사용 각각에 대해 다른 매크로를 처리해야하며 std :: cout이 아닌 모든 std :: ostream으로 이동할 수 있습니다. 그냥 데이터에 대한 적절한 스트리밍 연산자를 제공

std::ostream operator<<(std::ostream&, const T&); 
std::ostream operator<<(std::ostream&, const std::vector<T>&); 
etc 

하지만 난 #x를에 의해 제공되는 변수 이름이 매크로를 대체하는 템플릿 방법이었다, 또는 적어도 바랍니다.

관련 문제