2013-02-21 4 views
8

Ho riscontrato un problema con l'utilizzo di macro negli spazi dei nomi. Il codice èMacro e spazi dei nomi 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; 
} 

Qual è la corretta variante di utilizzo di oggetti namespace nelle macro.

risposta

11

Le macro sono gestite dal pre-processore, che non conosce nulla sui namespace. Quindi le macro non sono namespace, sono solo sostituzioni di testo. L'uso dei macro è davvero scoraggiato, tra l'altro perché inquinano sempre lo spazio dei nomi globale.

Se è necessario stampare un messaggio e è necessario assegnargli un nome, utilizzare semplicemente una funzione inline. Il codice sembra abbastanza semplice da essere correttamente in linea:

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

Non funzionerà. Le macrose non sanno nulla dei namespace. Se si desidera utilizzare gli spazi dei nomi, non è necessario utilizzare macrose.

+0

Può essere utile una soluzione alternativa. Nel mio progetto devo usare macro nello spazio dei nomi e devono chiamare macro da un altro spazio dei nomi. – shadeglare

+0

@MaxFX, le macro non sono "chiamate", sono sostituite. Se hai bisogno di usare macro per qualcosa di troppo complesso, stai facendo qualcosa di sbagliato. – StoryTeller