Saturday 21 October 2017

Waitforexit Macro ++ Esempio C


Oppure, per salvaguardare contro i problemi macro annidate: E questo è quello che viene compilato: utilizzare per combinare i parametri macro in un unico token (Token nome della variabile, ecc) e stringa i un parametro macro (molto utile quando si fa riflessione in CC) Utilizzare un prefisso per le macro, dal momento che sono tutti nello stesso spazio dei nomi e non volete collisioni con qualsiasi altro codice. (Ho scelto MLV in base al nome utente) Le macro involucro aiuto se si macro nido, cioè chiamano MLVGET da un'altra macro con altri parametri mergedstringized (come per il commento qui sotto, grazie). risposto 30 Apr 09 alle 12: 02I d'accordo, chrish. Prima lambda39s, foreach era una cosa brutta, perché il codice ogni elemento è stato runnnig attraverso non era locale al punto di chiamata. per ciascuno. (E mi raccomando BOOSTFOREACH invece di una soluzione arrotolato a mano) let39s si mantiene il codice vicino al sito iterazione, il che rende più leggibile. Detto questo, una volta lambda39s stendere, foreach potrebbe ancora una volta essere la strada da percorrere. ndash GManNickG 18 agosto 09 alle 23:50 guardie file di intestazione necessitano macro. Ci sono altre aree che necessitano di macro Non molte (se presente). Ci sono altre situazioni che beneficiano di macro SI. Un posto che uso delle macro è con codice molto ripetitivo. Ad esempio, quando la confezione codice C per essere utilizzato con altre interfacce (COM, Python, ecc), ho bisogno di catturare diversi tipi di eccezioni. Ecco come ho farlo: devo mettere queste catture in ogni funzione wrapper. Invece di digitare i blocchi pieni di cattura ogni volta, mi basta digitare: Questo rende anche più facile manutenzione. Se mai dovessi aggiungere un nuovo tipo di eccezione, ce n'è solo un posto che ho bisogno di aggiungerlo. Ci sono altri esempi utili troppo: molte delle quali includere il file e LINE macro del preprocessore. In ogni caso, le macro sono molto utili quando usato correttamente. Le macro non sono male - loro uso improprio è il male. Diciamo pure ignorare le cose ovvie come guardie di intestazione. A volte, si desidera generare il codice che deve essere copypasted dal precompilatore: che consente di codificare questo: e può generare messaggi come: Si noti che la miscelazione dei modelli con le macro può portare a risultati ancora migliori (cioè generare automaticamente i valori side-by - Side con i loro nomi di variabili) Altre volte, è necessario il file Andor la linea del codice, per generare informazioni di debug, per esempio. Il seguente è un classico per Visual C: Come con il seguente codice: genera messaggi come: Altre volte, è necessario generare il codice utilizzando le e concatenazione operatori, come la generazione di getter e setter per una proprietà (questo è per un bel casi limitati , attraverso). Altre volte, si genererà il codice di solito compilare se utilizzato tramite una funzione, come: che può essere utilizzato come (ancora, ho visto solo questo tipo di codice usato una volta giustamente) Ultimo, ma non meno importante, il famoso boost :: foreach. (Nota: il codice copypasted dalla homepage spinta) che è (secondo me) il modo migliore di std :: foreach. Così, le macro sono sempre utili, perché sono al di fuori delle normali regole del compilatore. Ma trovo che la maggior parte della volta che vedo uno, loro sono resti efficace di codice C mai tradotta in una corretta C. Anche con C11, un sacco di ciò che il vostro macro non può essere lasciato per una funzione di fare: includere ltsstreamgt includono ltiostreamgt using namespace std traccia vuoto (file const char, linea int, ostream amp o) struct Oss definiscono tRACE (ostreamstuff) trace (FILE, LINE, Oss (). lval () ltltostreamstuff) int main () In questo modo, la macro è il modo più breve. ndash Rainer Blome 29 aprile 16 al 13:28 Nel mio ultimo lavoro, stavo lavorando su un programma antivirus. Per rendere cosa più facile per me per eseguire il debug, ho avuto un sacco di registrazione bloccato in tutto il luogo, ma in una applicazione di forte domanda del genere, la spesa di una chiamata di funzione è semplicemente troppo costoso. Quindi, mi si avvicinò con questo piccolo Macro, che ancora mi ha permesso di attivare la registrazione di debug su una versione in un sito i clienti, senza il costo di una chiamata di funzione potrebbe controllare il flag di debug e solo tornare senza registrare nulla, o se abilitato , avrebbe fatto la registrazione. La macro è stata definita come segue: A causa delle VAARGS nelle funzioni di registro, questo è stato un buon esempio per una macro come questa. Prima di allora, ho usato una macro in un'applicazione di alta sicurezza che aveva bisogno di dire all'utente che non hanno avuti il ​​corretto accesso, e sarebbe dire loro che cosa bandiera di cui avevano bisogno. Il Macro (s) definito come: Allora, abbiamo potuto solo cospargere i controlli in tutta l'interfaccia utente, e sarebbe dire che i ruoli sono stati autorizzati a eseguire l'azione si è tentato di fare, se non ha ancora dispone già di quel ruolo. La ragione per due di loro era per restituire un valore in alcuni punti, e ritorno da una funzione void in altri. In ogni modo, questo è il modo Ive li ha usati, e non sono sicuro di come questo avrebbe potuto essere aiutato con i modelli. Oltre a questo, cerco di evitare loro, a meno che realmente necessario. Ancora un altro foreach macro. T: tipo, c: contenitore, I: Uso iteratore (concetto mostrando, non reale): implementazioni migliori disponibili: Google BOOSTFOREACH Forse l'utilizzo greates delle macro è in sviluppo indipendente dalla piattaforma. Pensate a casi di tipo incoerenza - con le macro, si può semplicemente utilizzare diversi file header - come: --WINTYPES. H Molto leggibile di attuazione in altri modi, a mio parere. Io uso delle macro per definire facilmente eccezioni: dove DEFEXCEPTION è Sembra VAARGS sono stati menzionati solo indirettamente finora: Durante la scrittura di codice C03 generici, ed è necessario un numero variabile di parametri (generici), è possibile utilizzare una macro invece di un modello. Nota: In generale, il nome checkthrow potrebbe anche essere incorporato nella funzione getopfromname ipotetica. Questo è solo un esempio. Ci potrebbe essere un altro codice generico che circonda la chiamata VAARGS. Una volta che otteniamo modelli variadic con C11, possiamo risolvere questo correttamente con un modello. Credo che questo trucco è un sapiente uso del preprocessore che non può essere emulato con una funzione: Poi si può usare in questo modo: è anche possibile definire una macro RELEASEONLY. Questo trucco non funziona secondo lo standard. Si tenta di creare un marcatore di commento attraverso il preprocessore, ma i commenti devono essere rimossi prima che il preprocessore viene eseguito. Un compilatore conforme causerà un errore di sintassi qui. ndash David Thornley 23 ottobre 08 alle 19:20 dispiace David, ma il compilatore deve contenere una seconda copia di commento rimozione. ndash Joshua 13 agosto 09 al 20:16 molto più semplice è quello di rendere la bandiera di debug un const bool globale, e utilizzare il codice come questo: if (debug) cout LTLT quot. quot - non è necessario per le macro ndash Stefan Monov 17 Gennaio 10 alla 16:51

No comments:

Post a Comment