2016-07-01 17 views
4

In C++ verwende ich so etwas wie dieses DEBUG Makros:Hat Rust ein Debug-Makro?

#ifdef DEBUG 
#define DEBUG_STDERR(x) (std::cerr << (x)) 
#define DEBUG_STDOUT(x) (std::cout << (x)) 
#else 
#define DEBUG_STDERR(x) 
#define DEBUG_STDOUT(x) 
#endif 

Rostet etwas ähnliches haben?

Antwort

3

Obwohl es Sinn macht, so etwas wie die log Kiste zu verwenden, wie in DK Antwort erwähnt, ist hier, wie die direkte Äquivalent tun, was Sie gefragt:

// The debug version 
#[cfg(feature = "my_debug")] 
macro_rules! debug_print { 
    ($($args:expr),*) => { println!($($args),*); } 
} 

// Non-debug version 
#[cfg(not(feature = "my_debug"))] 
macro_rules! debug_print { 
    ($($args:expr),*) => {} 
} 

fn main() { 
    debug_print!("Debug only {}", 123); 
} 

Und in Ihrem Cargo.toml, einen [features] Abschnitt hinzufügen:

[features] 
my_debug = [] 

Der Ausgang erscheint dann mit cargo run --features my_debug, und nicht mit einem Klar cargo run.

+0

Dies kann ein wenig präziser sein, indem Sie das vorhandene 'debug_assertions' Attribut, das Makros steuert, wie' debug_assert! ', Entfernen. Ändern Sie einfach die '# [cfg (feature =" my_debug ")]' Bits in '# [cfg (debug_assertions)]' und legen Sie die Änderung in 'Cargo.toml' ab. Auf diese Weise wird der Debug-Code automatisch für Release-Builds ignoriert! –

8

Sie könnten sie selbst definieren, aber es wäre einfacher, die log Kiste zu verwenden, die mehrere Makros für verschiedene Zwecke definiert (siehe the log documentation).

Beachten Sie, dass die Kiste nur die Frontend für die Protokollierung bietet; Sie müssen auch ein Backend auswählen. Es gibt ein grundlegendes Beispiel in der log Dokumentation, oder Sie könnten etwas wie env_logger oder log4rs verwenden.