11高级议题
一、宏
1.#define的使用
1.1预处理 编译 汇编 链接
1 | 预处理:gcc define.c -o define.i -E 编译生成.i文件,使代码停留在这个阶段 |
1.2标识符命名规则
①只能由数字、字母、下划线组成
②不能以数字开头
③不能是C语言关键字
1 | 5za _he xxx A |
1.3 宏延续运算符 \ 表示逻辑上连成一行
1 |
2.define定义常量宏
2.1基本用法
1 |
2.2取消宏标识符PI的声明
1 |
3.define的带参宏
3.1宏定义的表达式都加上括号,传入参数可能是表达式
1 |
防止参数类型不一致,typeof(a) 获取表达式a的结果类型,定义一个变量存储它的值 {}把这一段看成一个整体 (void)(&_a == &_b); 检查两个比较参数的类型是否一致,C语言对地址类型非常敏感。
1 |
|
3.2宏定义的#的使用
①#的作用,把传入的参数添加双引号,当作字符串处理
1 |
|
输出:123 and 456:We are friend
②##的作用,n##x链接两个字符串
1 |
|
输出:n1 = 100
③C语言把多个字符串以空格隔开,会看成一个,处理时会链接在一起
1 | char *s = "123 " "456 " "xyz"; |
输出:123 456 xyz
abcxyz
④可以用do … while(0)将宏的多条语句这种子串放在一起
1 |
|
4.预定义宏
1 | DATE //预处理日期,格式为“MMM DD YYYY”的字符串 |
5.ifdef和ifndef和#if
①ifndef
1 |
|
②ifdef
1 |
|
③#if
1 |
|
区别:#if后面跟整型常量表达式
表达式为真假,来判断代码编译与否
#ifdef和#ifndef 后面跟宏名
宏名有没有定义,来判断代码是否编译
④编译的时候,gcc可以添加-D参数,定义一个宏标识符
1 | gcc ifdef和ifndef.c -o d.i -E -DA |
二、Typedef的使用
1 | // 基本类型别名定义 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.