Rust函数名(调用方)或宏内的任何其他上下文

Rust函数名(调用方)或宏内的任何其他上下文,rust,macros,Rust,Macros,Rust中是否有方法获取宏中的“调用”函数名或任何其他上下文信息 例如: #[macro_export] macro_rules! somemacro { ( $x:expr ) => { { // access function name (etc..) that called this macro } }; } 这可以使用程序宏来完成: 外部板条箱程序宏; 使用proc_macro::TokenStream; #[过

Rust中是否有方法获取宏中的“调用”函数名或任何其他上下文信息

例如:

#[macro_export]
macro_rules! somemacro {
    ( $x:expr ) => {
        {
          // access function name (etc..) that called this macro
        }
    };
}

这可以使用程序宏来完成:

外部板条箱程序宏;
使用proc_macro::TokenStream;
#[过程宏属性]
pub fn,带有\u名称(\u:TokenStream,item:TokenStream)->TokenStream{
让mut input=syn::parse_macro_input!(项为syn::ItemFn);
设fn_name=input.ident.to_string();
让const_decl=quote::quote{
const THIS_FN:&str=#FN_name;
};
insert(0,syn::parse(const_decl.into()).unwrap());
让输出=报价::报价{
#输入
};
output.into()
}
Cargo.toml:

[package]
name = "with_name"
version = "0.1.0"
edition = "2018"

[lib]
proc-macro = true

[dependencies]
quote = "0.6.12"
syn = { version = "0.15.37", features = ["full"] }
它可以用作:

#[带_名称::带_名称]
fn foo(){
println!(“名称:{}”,这是FN);
}
fn main(){
foo();
}
还要注意,如果您只关心模块,则:

mod测试{
pub fn foo(){
println!((“模块:{}”,模块_路径!());
}
}
fn main(){
test::foo();
}

这可以使用程序宏来完成:

外部板条箱程序宏;
使用proc_macro::TokenStream;
#[过程宏属性]
pub fn,带有\u名称(\u:TokenStream,item:TokenStream)->TokenStream{
让mut input=syn::parse_macro_input!(项为syn::ItemFn);
设fn_name=input.ident.to_string();
让const_decl=quote::quote{
const THIS_FN:&str=#FN_name;
};
insert(0,syn::parse(const_decl.into()).unwrap());
让输出=报价::报价{
#输入
};
output.into()
}
Cargo.toml:

[package]
name = "with_name"
version = "0.1.0"
edition = "2018"

[lib]
proc-macro = true

[dependencies]
quote = "0.6.12"
syn = { version = "0.15.37", features = ["full"] }
它可以用作:

#[带_名称::带_名称]
fn foo(){
println!(“名称:{}”,这是FN);
}
fn main(){
foo();
}
还要注意,如果您只关心模块,则:

mod测试{
pub fn foo(){
println!((“模块:{}”,模块_路径!());
}
}
fn main(){
test::foo();
}

向函数添加属性是否为选项?(例如,
#[用你的名字]fn foo(){}
)也许这有帮助:@mcarton我想是吧。。。但我不明白如何在一个例子中访问它,在这个例子中,宏将在函数中被调用。你能举个例子吗?我从Phimueme提供的链接中了解到,宏需要根据不同的属性进行标记。向函数添加属性是一个选项吗?(例如,
#[用你的名字]fn foo(){}
)也许这有帮助:@mcarton我想是吧。。。但我不明白如何在一个例子中访问它,在这个例子中,宏将在函数中被调用。你能举个例子吗?我从Phimueme提供的链接中了解到,宏需要根据不同的属性进行标记。