2013-02-21 13 views
8

Mam problem z używaniem makr w przestrzeniach nazw. Kod jestC++ makra i przestrzenie nazw

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

Jaki jest właściwy wariant z użyciem przestrzeni nazw obiektów w makr.

Odpowiedz

11

Makra są obsługiwane przez preprocesor, który nie wie nic o przestrzeniach nazw. Tak więc makra nie są nazwane, są tylko podstawianymi tekstami. Używanie makr jest naprawdę odradzane, między innymi dlatego, że zawsze zanieczyszczają globalny obszar nazw.

Jeśli potrzebujesz wydrukować wiadomość, a potrzebujesz jej do umieszczenia w przestrzeni nazw, po prostu użyj funkcji wstawiania. Kod wydaje się na tyle prosty, że można go poprawnie wstawić:

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

To nie zadziała. Macroses nic nie wiedzą o przestrzeniach nazw. Jeśli chcesz używać przestrzeni nazw - nie możesz używać makr.

+0

Może pomóc w rozwiązaniu problemu. W moim projekcie muszę używać makr w przestrzeni nazw i muszą wywoływać makra z innej przestrzeni nazw. – shadeglare

+0

@MaxFX, makra nie są "wywoływane", są podstawiane. Jeśli potrzebujesz makr do czegoś zbyt skomplikowanego, robisz coś nie tak. – StoryTeller

Powiązane problemy