【发布时间】:2018-06-16 08:34:52
【问题描述】:
为什么我必须显式地macro_use 宏不直接由我的代码使用,而仅由我的代码依赖项使用?
下图有两种情况:
- 仅由我的依赖项使用的宏
-
call,do_parse,map,take,error_if
-
- 仅由我的依赖项使用的其他范围名称
-
parse_der_defined(函数)、fold_parsers(函数)、DerObject(结构)、DerObjectContent(结构)
-
奖金问题
在编码时处理此问题的最佳工作流程是什么?只是编译器错误,添加名称,冲洗,重复?
// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(call, do_parse, map, take)]
extern crate nom;
// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(error_if)]
extern crate rusticata_macros;
// Why is this necessary? My code does not directly use macros from this scope.
#[macro_use(parse_der_sequence_defined, parse_der_defined, fold_parsers)]
extern crate der_parser;
// My code does not directly use these names. Why do I need to `use` them?
use der_parser::{der_read_element_header, DerObjectContent};
// Why is this necessary? My code does not directly use these names.
use nom::{Err, ErrorKind};
// I actually use these
use nom::IResult;
use der_parser::DerObject;
fn seq_of_integers(input: &[u8]) -> IResult<&[u8], DerObject> {
parse_der_sequence_defined!(input, der_parser::parse_der_integer)
}
fn main() {
let input = [
0x30, // ASN.1 sequence
0x03, // length 3 bytes
0x02, // ASN.1 Integer
0x01, // length 1 byte
0x07, // 7
];
let der_result = seq_of_integers(&input);
match der_result {
IResult::Done(_unparsed_suffix, der) => {
assert_eq!(_unparsed_suffix.len(), 0);
let der_objects = der.as_sequence().unwrap();
for (index, der_object) in der_objects.iter().enumerate() {
println!("{}: {}", index, der_object.content.as_u32().unwrap());
}
}
IResult::Error(error) => {
eprintln!("{}", error);
}
IResult::Incomplete(_needed) => {
eprintln!("{:?}", _needed);
}
};
}
【问题讨论】:
-
宏在使用的地方展开。所以它使用的任何东西都必须在扩展站点上可用。
-
虽然通常您不需要将宏使用的函数引入作用域,因为编写良好的宏在使用函数时会使用绝对名称。
标签: rust