2012-09-08 24 views
5

Sono relativamente nuovo al C++ e sto seguendo una lezione. Alla nostra classe è stato assegnato un laboratorio e il mio insegnante ha detto che la stesura del laboratorio è un po 'difficile da capire; tuttavia, non ha apportato modifiche alla documentazione del laboratorio. Così, mi sono imbattuto in questa parte del laboratorio:Definizione di una macro preprocessore

Definizione di un preprocessore macro

lunga data convenzione capitalizza i nomi delle macro, e questo nome di macro deve essere TRACE_FUNC. La macro ha un singolo parametro, un simbolo che verrà sostituito da un nome di funzione quando si applica la macro al codice. L'inizio della macro è simile al seguente:

#define TRACE_FUNC(symbol) replacement-text` 

e il preprocessore sostituirà il testo di sostituzione in tutto il mondo che la (MGS) stringa TRACE_FUNC esiste nel codice sorgente, e mangimi il simbolo in quella sostituzione.

NOTA: l'istruzione #define deve essere su un'unica riga logica. Per mantenere la lunghezza gestibile, puoi sfuggire al carattere di nuova riga con una barra rovesciata alla fine della riga; che manterrà felice il preprocessore permettendoti di estendere una definizione su più linee.

Per questo esercizio, il testo sostitutivo deve essere una dichiarazione completa, incluso il punto e virgola finale.

Il testo sostitutivo deve essere un'istruzione di uscita che stampa il simbolo seguito dal testo() chiamato. e una nuova riga sullo standard output. È possibile copiare e modificare una delle istruzioni di output dal file di origine warning.cpp.

warning.cpp è solo un file che stiamo utilizzando e TRACE_FUNC è di essere immessi in un file di intestazione.

Quindi, ho letto questo un paio di volte e non sono sicuro al 100% che cosa sta chiedendo. Guardandolo in un modo, sembra che mi stia chiedendo di creare una macro chiamata TRACE_FUNC. Se lo guardi in un altro modo, mi sta chiedendo di usare la macro TRACE_FUNC. Tutto ciò va bene, ma non so come usare TRACE_FUNC affatto, non riesco a trovare alcuna documentazione su di esso da nessuna parte e non so come creare una macro. Quando ho chiesto aiuto, il mio insegnante ha semplicemente detto. le parole e non quelle che sono state molto utili perché è stata una risposta molto tortuosa e confusa senza spiegazione di cosa sia effettivamente TRACE_FUNC.

Fondamentalmente, tutto ciò che il mio insegnante ha detto è che il simbolo all'interno di TRACE_FUNC deve essere il nome di una delle funzioni nel codice sorgente. Ad esempio, supponiamo di avere una funzione foo() all'interno di un avviso, quindi il simbolo dovrebbe essere foo() (o foo, non ne sono sicuro neanche io), dalla sua spiegazione. Inoltre, nel testo sostitutivo, apparentemente il nome stesso verrà sostituito se metto # davanti al simbolo. Ho pensato che dovrei denotare le direttive del preprocessore. Perché dovrei usarlo qui?

In ogni caso, fare ciò che dice il mio insegnante praticamente non fa nulla. Né questa linea

#define TRACE_FUNC(foo()) #foo() called. ;

né questa linea

#define TRACE_FUNC(foo) #foo() called. ;

sostituire qualsiasi testo, che sono abbastanza sicuro che è il funzionamento della direttiva #define.Quindi devo applicare quello che ha detto la mia insegnante nel modo sbagliato, ma non so davvero perché è sbagliato o come risolverlo.

Quindi, la mia domanda. TRACE_FUNC è effettivamente una macro e se sì, c'è qualche documentazione su di esso che posso leggere? O dovrei creare TRACE_FUNC e se sì, esattamente come dovrei farlo?

risposta

6

Wow, che sciocchezza! Dovresti imparare bene il C++, non le complicazioni del preprocessore.

Ecco cosa si dovrebbe fare, anche se è indovinato da nessuno.

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n" 

void foo() 
{ 
    TRACE_FUNC(foo); 
    ... 
} 

sto supponendo che ci sono esempi da warning.cpp che utilizzano std::cout se poi non si dovrà adattare la sopra a tutto ciò che si trova in warning.cpp.

L'idea è che ogni funzione inizia con l'uso della macro TRACE_FUNC, in modo da poter tracciare l'esecuzione del codice. Perché il professore pensa che questa sia una buona idea per i neofiti è oltre me. Anche se fosse una buona idea, che ti aspetti di capire i dettagli per te stesso è persino più stupido.

Potrei migliorare la macro sopra ma questo probabilmente confonderà ancora di più così non lo farò. Per ora vorrei solo fare quello che dice il professore, ma ignorarlo. Spero che si imbatta in cose che vale la pena imparare in seguito.

+0

Grazie! Questo era molto più chiaro di quello che stava dicendo la mia insegnante. – FoolishOrpheus

+0

Considerare anche http://stackoverflow.com/a/257425/1689451 su come definire i macro delle funzioni. –

-1

ecco un esempio: utilizzare la funzione di stampa output nel vostro libray per sostituire la funzione printf standard di qui

#define TRACE_FUNC(sym) printf("%s() called", #sym); 

di usarlo come

TRACE_FUNC(printf) 

l'uscita dovrebbe essere

printf() called 

il tuo compito è quello di stampare un simbolo in un formato definito. quindi hai bisogno di printf o di funzioni simili nel tuo #define.

Problemi correlati