Merlin Asked:2022-02-27 18:43:11 +0000 UTC2022-02-27 18:43:11 +0000 UTC 2022-02-27 18:43:11 +0000 UTC 编写自己的库时不能使用 Rust 语言的哪些特性? 772 例如:是否可以在编写的库的代码中使用宏? dll 1 个回答 Voted Best Answer mzabaluev 2022-03-03T09:01:49Z2022-03-03T09:01:49Z 据我所知,该语言只有少数特殊功能无法在库 crate 代码中使用,而不受程序整体布局的限制。这些是全局符号,例如函数main、全局分配器或紧急处理程序。 您可以使用某些功能,但不建议在库中使用。在最常见的反模式中,可以注意到隐藏的全局或线程局部对象(使用Once、lazy_static!等thread_local!)的延迟初始化对程序的行为产生了不小的影响。例如,如果您使用使用来自 async-std 的异步功能的库,则 async-std 会静默初始化其用于异步任务的全局线程池执行引擎,即使您对此实现细节一无所知。tokio 做得更好:库不会Runtime悄悄地初始化,但如果它的任何异步原语被脱离上下文使用,就会引起恐慌Runtime。 最后,还有 crate 类型cdylib,用于创建具有 C 兼容 ABI 的动态加载库。此类 crate的公共接口只能包含函数extern "C";此类函数的参数和返回值中也有推荐的数据类型限制,例如结构类型必须有repr(C). 在类型库代码的其余部分,cdylib您可以使用该语言的所有功能,包括宏和标准库。
据我所知,该语言只有少数特殊功能无法在库 crate 代码中使用,而不受程序整体布局的限制。这些是全局符号,例如函数
main、全局分配器或紧急处理程序。您可以使用某些功能,但不建议在库中使用。在最常见的反模式中,可以注意到隐藏的全局或线程局部对象(使用
Once、lazy_static!等thread_local!)的延迟初始化对程序的行为产生了不小的影响。例如,如果您使用使用来自 async-std 的异步功能的库,则 async-std 会静默初始化其用于异步任务的全局线程池执行引擎,即使您对此实现细节一无所知。tokio 做得更好:库不会Runtime悄悄地初始化,但如果它的任何异步原语被脱离上下文使用,就会引起恐慌Runtime。最后,还有 crate 类型
cdylib,用于创建具有 C 兼容 ABI 的动态加载库。此类 crate的公共接口只能包含函数extern "C";此类函数的参数和返回值中也有推荐的数据类型限制,例如结构类型必须有repr(C). 在类型库代码的其余部分,cdylib您可以使用该语言的所有功能,包括宏和标准库。