2016-10-09 15 views
1

私はcpythonクレートを使用してPythonモジュールを作成するために、カップルのチュートリアルを見たが、時に建物それでもエラーがありました:別のクレートで定義されたマクロを使用するにはどうすればよいですか?

extern crate cpython; 

use cpython::{PyObject, PyResult, Python, PyTuple, PyDict, ToPyObject, PythonObject}; 

fn add_two(py: Python, args: &PyTuple, _: Option<&PyDict>) -> PyResult<PyObject> { 
    match args.as_slice() { 
     [ref a_obj, ref b_obj] => { 
      let a = a_obj.extract::<i32>(py).unwrap(); 
      let b = b_obj.extract::<i32>(py).unwrap(); 
      let mut acc:i32 = 0; 

      for _ in 0..1000 { 
       acc += a + b; 
      } 

      Ok(acc.to_py_object(py).into_object()) 
     }, 
     _ => Ok(py.None()) 
    } 
} 

py_module_initializer!(example, |py, module| { 
    try!(module.add(py, "add_two", py_fn!(add_two))); 
    Ok(()) 
}); 

私が手:

私はそれを得るのですか
error: macro undefined: 'py_module_initializer!' 

?私は錆1.12を使用しています。その他のエラーの


UPD

  1. (答えのように)#[macro_use]を追加する必要があり
  2. からexamples here
+0

scan!()を使用してu8を読み取ったときに["マクロが未定義]となる可能性があります(http://stackoverflow.com/questions/38396104/macro-undefined-when-reading-u8-using-scan) – mcarton

答えて

4

は、おそらく次のようにcpythonを宣言する必要があります:

#[macro_use] extern crate cpython; 

cpythonのマクロを使用できるようにします。 the example in its docsにご相談ください。

2

を参照してくださいあなたはextern crate宣言で#[macro_use]属性を追加する必要がありますコンパイラに、クレートiによってエクスポートされたマクロを持って来るように依頼するあなたの木枠の名前空間に。

#[macro_use] 
extern crate cpython; 
関連する問題