视频网站的广告能怎么做,电商网站运营方案,国庆节网页设计素材,做网站的图片从哪里找文章目录 #define 预处理指令一、#define宏定义二、查看预处理文件三、#define 的使用方法四、C语言宏中“#”和“##”的用法五、常见的宏定义总结六、常考题目 #define 预处理指令
#define 是 C 和 C 编程语言中的预处理指令#xff0c;用于定义宏#xff08;macro#xf… 文章目录 #define 预处理指令一、#define宏定义二、查看预处理文件三、#define 的使用方法四、C语言宏中“#”和“##”的用法五、常见的宏定义总结六、常考题目 #define 预处理指令
#define 是 C 和 C 编程语言中的预处理指令用于定义宏macro。宏是一种预处理器功能它允许程序员定义一个标识符通常是大写字母该标识符可以被替换为一段代码、表达式或常量值。
一、#define宏定义
#define叫做宏定义语法格式 #define 名字 值 例如#define PI 3.1415926
注意事项
存储方式#define 宏定义不分配内存它们只是在编译时替换文本。没有分号#define 指令末尾不需要分号分号会被视为值的一部分。作用域#define 声明之后在整个文件或宏的作用域内有效直到 #undef 指令出现或者文件结束。
定义一个宏名字之后可以在其他宏定义中使用例如 #define OEN 1 #define TWO OENONE #define THREE OENTWO
二、查看预处理文件
gcc -E define.c -o define.i
对 define.c 文件执行预处理操作并将预处理后的结果输出到 define.i 文件中。
这通常用于查看宏定义展开、文件包含等情况而不是为了生成可执行文件或目标代码。gcc: 这是 GNU 编译器集合的命令行工具用于编译 C 和 C 程序。-E: 这是 GCC 的一个选项代表“预处理”Preprocess。使用这个选项时GCC 将执行预处理操作但不会进行编译。预处理操作包括宏展开、文件包含#include的处理等。define.c: 这是要预处理的 C 语言源文件。GCC 将读取这个文件并应用预处理指令。-o: 这个选项后面跟着输出文件的名称。在这里它指定了预处理后的结果应该被写入哪个文件。define.i: 这是预处理后生成的文件的名称。由于使用了 -E 选项GCC 不会生成目标代码文件通常是 .o 文件而是生成一个包含了所有预处理操作结果的文件。
三、#define 的使用方法
1、定义常量#define 最常见的用法是定义常量这些常量在程序中可以被多次引用而其值在编译时就已经确定。
#define PI 3.14159262、字符串化操作将宏转换为字符串。
#define FILE_PATH /home/orangepi/project/
使用FILE_PATH替换/home/orangepi/project/3、头文件保护#ifndef、#define 和 #endif 是 C 和 C 预处理器指令的一部分通常一起使用来实现头文件保护也称为 “include guards” 或 “include sentinels”。这种机制可以防止头文件被多次包含到同一个源文件中从而避免编译错误和重定义问题。
#ifndef _HEADER_FILE_H_
#define _HEADER_FILE_H_// 头文件内容例如函数声明、类定义、宏定义等#endif
/*当你的头文件被包含时预处理器会检查这个宏是否已经定义。如果尚未定义它将定义这个宏并处理头文件中的所有内容。如果已经定义
预处理器将跳过整个头文件的内容防止它被再次包含。
这种机制对于避免因重复包含头文件而导致的编译错误非常重要特别是在大型项目中头文件之间可能会相互依赖导致复杂的包含关系。使用
头文件保护可以确保每个头文件只被编译一次。*/4、宏函数使用 #define 可以定义宏函数这些宏在预处理阶段展开替换为它们的参数表达式从而减少函数调用的开销。
1.无参宏
#define debug printf(hello world)
int main{debug;return 0;
}2.带参宏
语法不是进行简单的字符串替换还要进行参数替换
#define宏名(形参列表) 字符串
#define debug(s) printf(%s\n,s)
int main{debug(hello world);return 0;
}【注意】要注意算数的优先级 如果宏定义中包含表达式需要小心处理副作用。
例
#include stdio.h#define M 32
#define N (32)int main()
{int data 4;printf(data * M %d\n,data * M);printf(data * N %d\n,data * N);return 0;
}
/*运行结果
data * M 14
data * N 20*/使用gcc -E define.c -o define.i查看生成的预处理文件define.i M 4*3 2 14 N 4*(32) 20 宏和函数的区别
和函数不同宏的参数没有数据类型因为是文本替换因为是文本展开相比函数没有执行调度的开销效率要高使用有参数的宏函数时参数在替换文字中要用括号包围以免收到运算符优先级的影响函数的参数是有类型的存在类型检查但是宏的参数没有类型与类型检查函数可以递归而宏不可以递归对于参数而言宏的参数是直接替换的所以会有一些 参数具有副作用而函数的参数是临时拷贝的没有副作用的情况
四、C语言宏中“#”和“##”的用法
1、#字符串化操作符
作用将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 【注意】其只能用于有传入参数的宏定义中且必须置于宏定义体中的参数名前。
#define example1(instr) printf(this is :%s\n,#instr)
#define example2(instr) #instr
当使用宏定义时
example1(abc);
//将会展开成printf(this is:%s\n,abc)string str example2(abc);
//将会展开成string str abc2、##符号连接操作符
作用操作符用于连接两个宏参数。当宏在预处理阶段展开时## 会将两侧的参数连接起来合并成一个新的标识符或字符串。
#define exampleNum(n) num##nint num9 9;
int num exampleNum(9);
//将会扩展成int num num9;【注意】
当用##连接形参时##前后的空格可有可无。连接后的实际参数名必须为实际存在的参数名或是编译器已知的宏定义。如果##后的参数本身也是一个宏的话##会阻止这个宏的展开。
#include stdio.h
#include string.h#define STRCPY(a, b) strcpy(a ## _p, #b) int main() {char var1_p[20];char var2_p[30];strcpy(var1_p, aaaa);strcpy(var2_p, bbbb);STRCPY(var1, var2);//宏展开为strcpy(var1_p, var2)//这会将字符串 var2 复制到 var1_p 中而不是将 var2_p 的内容复制到 var1_p 中。//因为 var2 不是一个有效的字符串而是一个文本标记。STRCPY(var2, var1);//宏展开为strcpy(var2_p, var1);//同样它尝试将字符串 var1 复制到 var2_p 中printf(var1 %s\n, var1_p);printf(var2 %s\n, var2_p);return 0;
}
/*运行结果
var1 var2
var2 var1*/
五、常见的宏定义总结
1、得到指定地址上的一个字节或字
#define MEM_B(x) (*((byte *)(x)))
#define MEM_W(x) (*((word *)(x)))2、求最大值和最小值
#define MAX(x,y) (((x)(y)) ? (x) : (y))
#define MIN(x,y) (((x) (y)) ? (x) : (y))3、计算一个数的绝对值
#define ABS(a) ((a) 0 ? -(a) : (a))4、交换两个变量的值
#define SWAP(a, b, type) do { type SWAP_temp (a); (a) (b); (b) SWAP_temp; } while(0)5、计算数组大小
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))6、将宏参数转换为字符串
#define STRINGIFY(x) #x7、连接两个宏参数
#define CONCAT(x, y) x ## y8、得到一个field在结构体(struct)中的偏移量
#define FPOS(type,field) ((dword)((type *)0)-field)9、得到一个结构体中field所占用的字节数
#define FSIZ(type,field) sizeof(((type *)0)-field)10、不使用sizeof求int、double等变量类型占用的字节数
#define Mysizeof(Value) (char*)(value1)-(cahr *)value11、声明以1年中有多少秒忽略闰年
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
使用UL或ul用作后缀表示将结果强制转换为 unsigned long 类型以确保表达式的结果作为无符号长整型处理。12、按照LSB格式把两个字节转化为一个Word
#define FLIPW(ray) ((((word)(ray)[0]) * 256) (ray)[1])13、按照LSB格式把一个Word转化为两个字节
#define FLOPW(ray,val) (ray)[0] ((val)/256); (ray)[1] ((val) 0xFF)14、得到一个变量的地址word宽度
#define B_PTR(var) ((byte *) (void *) (var))
#define W_PTR(var) ((word *) (void *) (var))15、得到一个字的高位和低位字节
#define WORD_LO(xxx) ((byte) ((word)(xxx) 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) 8))16、断言宏用于检查程序中的条件
#include assert.h
#define ASSERT(condition) assert((condition) #condition)六、常考题目
1、已定义#define M(x,y,z) x * y z 并且int a 1, b 2, c 3调用M(a b, b c, c a)的输出结果为12
#include stdio.h#define M(x,y,z) x * y z int main(int argc, char* argv[])
{int a 1, b 2, c 3;printf(M(ab, bc, ca) %d\n,M(ab, bc, ca));//展开后:printf(M(ab, bc, ca) %d\n,ab * bc ca);return 0;
}
/*运行结果
M(ab, bc, ca) 12*/计算下列程序的返回值是多少
#include stdio.h#define product(x) (x * x)int main(int argc, char* argv[])
{int i 3, j, k;j product(i);//展开后 j (i * i);printf(after j,i %d\n,i);k product(i);//展开后 k (i * i);printf(after k,i %d\n,i);printf(j %d, k %d\n,j,k);return 0;
}
/*运行结果
after j,i 5
after k,i 7
j 12, k 49*/
文章转载自: http://www.morning.hqgkx.cn.gov.cn.hqgkx.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.kldtf.cn.gov.cn.kldtf.cn http://www.morning.mdplm.cn.gov.cn.mdplm.cn http://www.morning.dyxlm.cn.gov.cn.dyxlm.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn http://www.morning.ldhbs.cn.gov.cn.ldhbs.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.pnmnl.cn.gov.cn.pnmnl.cn http://www.morning.mfmx.cn.gov.cn.mfmx.cn http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.bpmdr.cn.gov.cn.bpmdr.cn http://www.morning.sxcwc.cn.gov.cn.sxcwc.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.fnwny.cn.gov.cn.fnwny.cn http://www.morning.fypgl.cn.gov.cn.fypgl.cn http://www.morning.rgxcd.cn.gov.cn.rgxcd.cn http://www.morning.mdfxn.cn.gov.cn.mdfxn.cn http://www.morning.mnsts.cn.gov.cn.mnsts.cn http://www.morning.woyoua.com.gov.cn.woyoua.com http://www.morning.lzzqz.cn.gov.cn.lzzqz.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn http://www.morning.mkzdp.cn.gov.cn.mkzdp.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.tgnr.cn.gov.cn.tgnr.cn http://www.morning.bwqr.cn.gov.cn.bwqr.cn http://www.morning.nxzsd.cn.gov.cn.nxzsd.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.yqkxr.cn.gov.cn.yqkxr.cn http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn http://www.morning.brbnc.cn.gov.cn.brbnc.cn http://www.morning.gbcxb.cn.gov.cn.gbcxb.cn http://www.morning.qmqgx.cn.gov.cn.qmqgx.cn http://www.morning.jygsq.cn.gov.cn.jygsq.cn http://www.morning.dygqq.cn.gov.cn.dygqq.cn http://www.morning.kpfds.cn.gov.cn.kpfds.cn http://www.morning.wjwfj.cn.gov.cn.wjwfj.cn http://www.morning.bhpsz.cn.gov.cn.bhpsz.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.tnjff.cn.gov.cn.tnjff.cn http://www.morning.gskzy.cn.gov.cn.gskzy.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.lzbut.cn.gov.cn.lzbut.cn http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.ryfpx.cn.gov.cn.ryfpx.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.bzlgb.cn.gov.cn.bzlgb.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.lgcqj.cn.gov.cn.lgcqj.cn http://www.morning.jjhng.cn.gov.cn.jjhng.cn http://www.morning.smmrm.cn.gov.cn.smmrm.cn http://www.morning.rgmls.cn.gov.cn.rgmls.cn http://www.morning.gkmwx.cn.gov.cn.gkmwx.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.baohum.com.gov.cn.baohum.com http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.lnsnyc.com.gov.cn.lnsnyc.com http://www.morning.xysdy.cn.gov.cn.xysdy.cn http://www.morning.tturfsoc.com.gov.cn.tturfsoc.com http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.mjxgs.cn.gov.cn.mjxgs.cn http://www.morning.qrndh.cn.gov.cn.qrndh.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.smcfk.cn.gov.cn.smcfk.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.ytbr.cn.gov.cn.ytbr.cn http://www.morning.jlqn.cn.gov.cn.jlqn.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.sjbpg.cn.gov.cn.sjbpg.cn http://www.morning.stflb.cn.gov.cn.stflb.cn http://www.morning.wqpm.cn.gov.cn.wqpm.cn http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.slqzb.cn.gov.cn.slqzb.cn