昆明网站设计能实现什么功能,南京制作网页速成班,莱芜梆子网站,手机怎么向wordpress传文件下载在C语言开发中#xff0c;宏定义是一个非常有用的工具#xff0c;它可以使我们的代码更容易理解#xff0c;更容易维护。如查一个常量在多处被使用#xff0c;且今后可能会根据不同需要而修改的话#xff0c;将其define一下那是再好不过了。除此之外#xff0c;宏定义还有… 在C语言开发中宏定义是一个非常有用的工具它可以使我们的代码更容易理解更容易维护。如查一个常量在多处被使用且今后可能会根据不同需要而修改的话将其define一下那是再好不过了。除此之外宏定义还有其他的功能了解它将更好地辅助我们开发C程序。先看个例子 #define Conn(x,y) x##y #define ToString(x) #x #define ToChar(x) #x 这几个宏定义中分别用到了“##”、“#”“#”它们的功能分别是 1、粘接操作符##——连接两个宏名注意所连接的是宏名而不是其所指代的值 如int Conn(a,b);定义了一个int型变量ab以后可以直接调用ab而不必采用Conn(a,b)的形式 printf(Conn(ab,cd));输出结果为abcd 但是 #define M 0 #define var(x) Var_##x ... int var(M);//此处定义了什么 根据ANSI/ISO C##操作符只是简单地粘接两个宏名则int var(M)定义的应该就是Var_M据测试这一点是没有问题的。但在一些比较古老的C编译环境中也有可能定义的是Var_0比如在TC 2.0中测试发现“Var_00”可编译通过而“Var_M0”出现ERROR。 2、字符串化操作符#——将宏名转化为字符串 如printf(ToString(var1));输出结果为var1。var1可以是一个已定义的变量名也可以是一个从未出现的字符组合 类似地若有 #define STR 0 ... printf(Tostring(STR));// 当前流行编译环境会输出STR而TC 2.0则会输出0。 3、字符化操作#——将宏名转化为字符注意早期编译器可能不支持 如 char c; c ToChar(1);//c 1 c ToChar(a);//c a 如果提供的宏中不止一个字符注意不能超过4个否则编译器报错则转化结果为最后一个字符如 c ToChar(abc);//c c c ToChar(abcd);//c d c ToChar(abcde);//ERROR 总结一下关于其用法是自己总结的肯定不全。 1、使用中遵循ANSI C中规定但要记得编译通不过是可能是早期编译器不支持C标准的问题 2、##操作可应用在变量定义中若程序开发中遇到要定义一大堆变量且这些变量具有相同的前缀时##很显得尤为重要它可以使代码更加整洁且减少了出错的机率。如果一旦后来发现需要批量修改变量前缀你会庆幸自己使用了这么一件利器 3、#操作符可用于调试时将变量名输出可配合##一起使用如定义#define CHECK_VAR(x,fmt) printf(#x #fmt \n, x)则CHECK_VAR(var1,%d)相当于printf(var %d\n, var1) Tips: 1、ANSI C中规定若宏定义名出现在引号 或 中则不进行替换但有些早期编译器的处理可能有所不同如#define CTRL(c) (‘c’ 37)按照标准CTRL(d)被扩展成(c 37)。显然这没有完成作者的本意它在某些编译器下碰巧能工作不过是个意外实际使用中应避免。2、字符串的连接不必使用##这么麻烦实际中两个字符串常量可以直接写到一起如printf(abcd)输出abcd。或在使用##宏定义时可以用printf(ToString(str) \n);输出字符串后换行以前不敢这样用后来试验了下发现还比较好使当然直接用puts也可完成同样功能。 3、若要使#或##转换的是宏字符常量的值也不是其名字可以使用间接方法如 #define ToString(x) #x #define Xstr(x) ToString(x) #define STR1 STR2 ... printf(Xstr(STR1));//输出结果是STR2而非STR1 转载于:https://blog.51cto.com/sunnylgz/628831