2014-06-24 2 views
0

Je me demande si quelque chose comme cela est possibleEst-il possible de compiler conditionnellement un bloc de code dans une fonction?

fn main() { 
    #[cfg(foo)] { 
     println!("using foo config"); 
    } 

} 

Le contexte est un code qui ne peut pas être testé de manière adéquate avec seulement des tests unitaires. Je vais souvent devoir lancer une "démo" cfg qui affiche des informations. Je suis à la recherche d'alternatives pour commenter manuellement certaines parties du code.

Répondre

6

Comme d'au moins Rust 1.21.1, il est possible de le faire aussi exactement que vous avez dit:

fn main() { 
    #[cfg(foo)] 
    { 
     println!("using foo config"); 
    } 
} 

Avant cela, il est impossible de le faire complètement sous condition (c.-à éviter le bloc étant entièrement vérifié par type), cela est couvert par RFC#16. Cependant, vous pouvez utiliser la macro cfg qui évalue soit true ou false sur la base des --cfg drapeaux:

fn main() { 
    if cfg!(foo) { // either `if true { ... }` or `if false { ... }` 
     println!("using foo config"); 
    } 
} 

Le corps du if a toujours de résolution de noms et une vérification du type run, donc peut ne pas toujours fonctionner.

0

Vous pouvez intéressé à la caisse cfg-if, ou une simple macro va faire:

macro_rules! conditional_compile { 
    ($(#[$ATTR:meta])* { $CODE: tt }) => { 
     { 
      match 0 { 
       $(#[$ATTR])* 
       0 => $CODE, 

       // suppress clippy warnning `single_match`. 
       1 =>(), 
       _ =>(), 
      } 
     } 
    } 
} 

fn main() { 
    conditional_compile{ 
     #[cfg(foo)] 
     {{ 
      println!("using foo config"); 
      // Or something only exists in cfg foo, like a featured mod. 
     }} 
    } 
} 
Questions connexes