1- ## 1 属性
1+ ## 属性
22
33属性(Attribute)是一种通用的用于表达元数据的特性,借鉴ECMA-334(C#)的语法来实现ECMA-335中描述的Attributes。属性只能应用于Item(元素、项),
44例如 ` use ` 声明、模块、函数等。
55
6- ### 1.1 元素
6+ ### 元素
77
88在Rust中,Item是Crate(库)的一个组成部分。它包括
99
2323它写到最外层作用域所实现的功能是一样的,只不过你要访问这些嵌套的Item就必须使用路径(Path),如` a::b::c ` 。但一些外层的Item不允许你使用路径去
2424访问它的子Item,比如函数,在函数中定义的静态变量、结构体等,是不可以通过路径来访问的。
2525
26- ### 1.2 属性的语法
26+ ### 属性的语法
2727
2828属性的语法借鉴于C#,看起来像是这样子的
2929
@@ -62,7 +62,7 @@ mod bar {
6262type int8_t = i8 ;
6363```
6464
65- ### 1.3 应用于Crate的属性
65+ ### 应用于Crate的属性
6666
6767* ` crate_name ` - 指定Crate的名字。如` #[crate_name = "my_crate"] ` 则可以让编译出的库名字为` libmy_crate.rlib ` 。
6868* ` crate_type ` - 指定Crate的类型,有以下几种选择
@@ -89,7 +89,7 @@ type int8_t = i8;
8989
9090* ` recursive_limit ` - 设置在编译期最大的递归层级。比如自动解引用、递归定义的宏等。默认设置是` #![recursive_limit = "64"] `
9191
92- ### 1.4 应用于模块的属性
92+ ### 应用于模块的属性
9393
9494* ` no_implicit_prelude ` - 取消自动插入` use std::prelude::* ` 。
9595* ` path ` - 设置此` mod ` 的文件路径。
@@ -108,7 +108,7 @@ type int8_t = i8;
108108 mod sys ;
109109 ```
110110
111- ### 1.5 应用于函数的属性
111+ ### 应用于函数的属性
112112
113113* ` main ` - 把这个函数作为入口函数,替代` fn main ` ,会被入口函数(Entry Point)调用。
114114* ` plugin_registrar ` - 编写编译器插件时用,用于定义编译器插件的入口函数。
@@ -152,11 +152,11 @@ fn unlikely_to_be_executed() {
152152}
153153```
154154
155- ### 1.6 应用于全局静态变量的属性
155+ ### 应用于全局静态变量的属性
156156
157157* ` thread_local ` - 只可用于` static mut ` ,表示这个变量是thread local的。
158158
159- ### 1.7 应用于FFI的属性
159+ ### 应用于FFI的属性
160160
161161` extern ` 块可以应用以下属性
162162
@@ -201,7 +201,7 @@ enum eType {
201201
202202* ` repr ` - 目前只接受` C ` 和` packed ` ,` C ` 表示结构体兼容C ABI,` packed ` 表示移除字段间的padding。
203203
204- ### 1.8 用于宏的属性
204+ ### 用于宏的属性
205205
206206* ` macro_use ` - 把模块或库中定义的宏导出来
207207 - 应用于` mod ` 上,则把此模块内定义的宏导出到它的父模块中
@@ -220,7 +220,7 @@ enum eType {
220220
221221* `no_link` - 应用于`extern crate `上,表示即使我们把它里面的库导入进来了,但是不要把这个库链接到目标文件中。
222222
223- ### 1 . 9 其它属性
223+ ### 其它属性
224224
225225* `export_function` - 用于静态变量或函数,指定它们在目标文件中的符号名。
226226
@@ -237,7 +237,7 @@ enum eType {
237237 struct Foo {}
238238 ```
239239
240- ### 1 . 10 条件编译
240+ ### 条件编译
241241
242242有时候,我们想针对不同的编译目标来生成不同的代码,比如在编写跨平台模块时,针对Linux和Windows分别使用不同的代码逻辑。
243243
@@ -318,7 +318,7 @@ if cfg!(target_arch = "x86") {
318318
319319这种方式不会产生任何运行时开销,因为不成立的条件相当于里面的代码根本不可能被执行,编译时会直接被优化掉。
320320
321- ### 1 . 11 Linter参数
321+ ### Linter参数
322322
323323目前的Rust编译器已自带的Linter,它可以在编译时静态帮你检测不用的代码、死循环、编码风格等等。Rust提供了一系列的属性用于控制Linter的行为
324324
@@ -329,7 +329,7 @@ if cfg!(target_arch = "x86") {
329329
330330编译器支持的Lint检查可以通过执行`rustc - W help`来查看。
331331
332- ### 1 . 12 内联参数
332+ ### 内联参数
333333
334334内联函数即建议编译器可以考虑把整个函数拷贝到调用者的函数体中,而不是生成一个`call`指令调用过去。这种优化对于短函数非常有用,有利于提高性能。
335335
@@ -343,7 +343,7 @@ if cfg!(target_arch = "x86") {
343343
344344内联会导致在一个库里面的代码被插入到另一个库中去。
345345
346- ### 1 . 13 自动实现Trait
346+ ### 自动实现Trait
347347
348348编译器提供一个编译器插件叫作`derive`,它可以帮你去生成一些代码去实现(impl )一些特定的Trait,如
349349
@@ -380,7 +380,7 @@ impl<T: Clone> Clone for Foo<T> {
380380
381381目前`derive`仅支持标准库中部分的Trait。
382382
383- ### 1 . 14 编译器特性
383+ ### 编译器特性
384384
385385在非稳定版的Rust编译器中,可以使用一些不稳定的功能,比如一些还在讨论中的新功能、正在实现中的功能等。Rust编译器提供一个应用于Crate的属性`feature`来启用这些不稳定的功能,如
386386
0 commit comments