gpt4 book ai didi

rust - 有没有办法在没有程序宏的情况下在属性中使用 "do macro stuff"?

转载 作者:行者123 更新时间:2023-11-29 08:31:32 25 4
gpt4 key购买 nike

具体来说,我正在尝试将宏输出放入文档注释中。我很兴奋这正是我想要的:

/// foo
///
#[doc="bar\n\nbaz"]
///
/// quux
struct Dummy;

下一步是用我的内容替换该字符串。根据 this ,我不能写 #[doc=my_content!()],属性宏是过程性的,所以我需要另一个 crate ,另外(我认为)我的内容可以生成无需任何程序宏功能。

有没有办法以某种方式用“传统宏”来做到这一点,还是我运气不好?

最佳答案

编辑:从 1.54.0 开始,Attributes can invoke function-like macros ,启用问题中提出的代码。原答案如下:


答案似乎是否定的。

查看 grammar for attributes ,除了括号、逗号和等号,属性最终只能包含文字。所以在这个层面上,Rust 不可能允许更多。


但是,反转结构可以实现类似的功能,并且 doc-comment crate 为文档评论做这个。不要从属性内部调用宏,而是使用宏来创建属性;然后该宏不限于仅采用文字*。缺点是,属性应该应用的项目必须是宏调用的一部分。所以这个

#[doc=my_content!()]
struct Foo;

变成这样:

doc_comment!(
my_content!(),
struct Foo;
);

宏的定义很简单:

#[macro_export]
macro_rules! doc_comment {
($x:expr, $($tt:tt)*) => {
#[doc = $x]
$($tt)*
};
}

(省略了 the original macro 的一个不属于核心模式的分支)

(感谢 jonas-schlevink 为我提供 pointing)


*除了最后一部分(将宏内容放入属性中),linked question's answer已经做到了。

关于rust - 有没有办法在没有程序宏的情况下在属性中使用 "do macro stuff"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56545552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com