2013-10-29 9 views
7

Abbiamo branching e tratti statici insieme a funzioni di programmazione del contratto sull'altro. I contratti sono grandi grazie alla funzione di affermazione di fornire il messaggio corretto. E il controllo statico non porta alcun sovraccarico a un codice compilato. Quindi, naturalmente, sarebbe molto utile avere una funzionalità per dare i messaggi di errore corretti in un momento di compilazione.Esiste un tipo di stampa statica in D?

Ad esempio, quando si cerca di ottenere un prodotto incrociato di un vettore e una forma 1 differenziale con la mia funzione, con asserzioni posso specificarlo in particolare sul problema in termini di dominio, non su come il compilatore lo vede in termini di strutture e array. O posso semplicemente restringere staticamente i tipi di argomenti di funzione, ma poi l'utente dovrebbe occuparsi dei messaggi del compilatore, non dei miei.

Quindi, la domanda è: c'è un modo per stampare messaggi personalizzati durante la compilazione?

risposta

9

Sì, è possibile emettere messaggi personalizzati utilizzando diversi modi:

  1. pragma(msg, message) valuteremo l'espressione message e stampare il risultato durante la compilazione.
  2. static assert(expression, message) causerà l'interruzione della compilazione quando expression, che viene valutata in fase di compilazione, è false. Questo è l'equivalente D della direttiva preprocessore C #error.
  3. Durante l'esecuzione di CTFE (Compile-Time Function), le eccezioni non rilevate e gli errori di asserzione fungono da errore in fase di compilazione ed emettono anche il messaggio allegato.
  4. La parola chiave deprecated ora può avere un messaggio di spiegazione.
  5. Attualmente non è possibile stampare un'espressione valutata durante l'interpretazione CTFE, sebbene ctfeWriteln sia proposto come variante writeln che funziona durante l'interpretazione CTFE.