2013-02-21 5 views
8

네임 스페이스에 매크로를 사용하는 데 문제가 있습니다. 코드는 매크로에서 네임 스페이스 개체를 사용하여 적절한 변형 무엇C++ 매크로 및 네임 스페이스

#include <iostream> 

namespace a 
{ 
#define MESSAGE_A(message) \ 
    std::cout << (message) << std::endl; 
} 

#define MESSAGE_A(message) \ 
    std::cout << (message) << std::endl; 

int main() 
{ 
    //works fine 
    MESSAGE_A("Test"); 
    //invalid 
    a::MESSAGE_A("Test") 
    return 0; 
} 

입니다.

답변

11

매크로는 이름 공간에 대해 알지 못하는 전처리 기가 처리합니다. 매크로는 네임 스페이스가 아니며 단지 텍스트 대체 일뿐입니다. 매크로의 사용은 항상 글로벌 네임 스페이스를 오염시키기 때문에 다른 이유들로 인해 사용하지 않는 것이 좋습니다.

메시지를 인쇄해야하고 네임 스페이스로 지정해야하는 경우 인라인 기능 만 사용하면됩니다. 코드는 제대로 인라인 될만큼 단순 해 보입니다.

namespace a 
{ 
    inline void MESSAGE_A(const char* message) 
    { 
    std::cout << message << std::endl; 
    } 
} 
2

작동하지 않습니다. Macroses는 네임 스페이스에 대해 아무것도 모릅니다. 네임 스페이스를 사용하려면 매크로를 사용하면 안됩니다.

+0

해결 방법 솔루션에 도움이 될 수 있습니다. 내 프로젝트에서 네임 스페이스에 매크로를 사용해야하고 다른 네임 스페이스에서 매크로를 호출해야합니다. – shadeglare

+0

@MaxFX, 매크로는 "호출"되지 않으며 대체됩니다. 지나치게 복잡한 것에 매크로를 사용해야 할 경우, 뭔가 잘못하고있는 것입니다. – StoryTeller