#### \_\_VA\_ARGS\_\_可变参数宏

```c
#define dgbmsg(fmt, ...) printf(fmt, __VA_ARGS__)
// ...代表一个可变参数表， 宏__VA_ARGS__代表了这些参数
// ##__VA_ARGS__的意思是：
//   如果可变参数为空或被忽略，__VA_ARGS__会多出来一个逗号
//   如果在__VA_ARGS__前面加上##，预处理器会去掉多出来的逗号
// 补充：#和##的作用
//   #用于把宏定义中的参数转化为字符串
//   ##用于把它左边和右边的内容拼接在一起
```

#### \_\_LINE\_\_

代表源码中当前行的行号

#### \_\_FILE\_\_

代表当前源文件的文件名

#### \_\_DATE\_\_

代表编译时的时期

#### \_\_TIME\_\_

代表编译时的时间

#### \_\_STDC\_\_

当值为1时要求程序严格遵循ANSI C标准

#### 查看GCC预定义的宏

`gcc -E -dM - </dev/null`

#### \__attribute__

\__attribute__关键字用于定义变量或结构体的属性。

- section子项的用法

  `__attribute__((section("section_name")))`，其作用是将函数或数据放入名为setion_name的段。