2016-08-27 14 views
2

インライン関数またはマクロが多くのコードに拡張される場合があります。しかし、定数を使用すると、デッドブランチを最適化することができます。値がRustのコンパイル時定数であることを確認できますか?

私はコード内のコメントを追加することができます。

// foo arg is always a constant, dead branches will be removed 

しかし、私はむしろ、これは常にそうであることを確認するために、静的アサーションのいくつかの種類を追加したいです。

値がコンパイル時定数であるかどうかを調べる方法はありますか?

GCCの__builtin_constant_pのようなものはありますか?

答えて

3

値または式の型が固定され、事前にわかっている場合は、ローカル定数を定義し、値または式で初期化できます。別の方法で定数を使用しない場合は、名前の前にアンダースコアを付けて、定数が使用されていないことに関するコンパイラの警告を抑止します。しかし、これはマクロでのみ動作します。

const _ASSERT_COMPILE_TIME_CONSTANT: i32 = $arg; 

夜間コンパイラはまた、コンパイラがコンパイル時に評価可能な発現を必要とする状況で使用することができる、すなわち機能を「CONST関数」を定義するサポート。これらの関数の本体には制限がありますが、コンパイル時に評価する必要のないconst関数の呼び出しサイトは、コンパイル時に評価できない式を引数として渡すことができるため、const関数を定義してもあなたが求めていることを保証します。値または式のタイプは、マクロで指定することができない場合constはタイプが指定されている必要がありますよう


は、我々は、それを省略することはできません。しかし、constイニシャライザで固定型を返すジェネリックconst関数を使うことができます!

// at the beginning of the crate 
#![feature(const_fn)] 

// in the macro's body 
const fn _swallow<T>(_x: T) {() } 
const _ASSERT_COMPILE_TIME_CONSTANT:() = _swallow($arg); 
0

@Francis答えに追加するには、これは一定の値を保証するために使用できるマクロです。

macro_rules! ensure_const_expr { 
    ($value:expr, $t:ty) => { 
     { 
      const _IGNORE: $t = $value; 
     } 
    } 
} 


// in a functions body 
ensure_const_expr!(some_variable, i32); 

余分な括弧がそのように複数の用途がで失敗していない必要とされている注:

error: a value named `_IGNORE` has already been defined in this block 
関連する問題