C/C++宏
来源:互联网 发布:电视CTR数据 编辑:程序博客网 时间:2024/06/14 00:00
字节对齐
#pragmapack(n)
如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式。
如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
宏的字符串操作
#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号。
#define STRING(x) #x
//下面二条句等价。
char*pChar = "hello";
char*pChar = STRING(hello);
#@是加单引号(Charizing Operator)
#define makechar(x) #@x
char ch = makechar(b);
char ch = 'b';//等价。
##的功能,它可以拼接符号(Token-pasting operator)
#define paster( n ) printf( "token"#n"= %d\n", token##n )
int token9 =100;
再调用 paster(9);宏展开后token##n直接合并变成了token9。整个语句变成了
printf( "token""9""= %d", token9 );
在C语言中字符串中的二个相连的双引号会被自动忽略,于是上句等同于
printf("token9= %d", token9);。
即输出token9 = 100
性能问题
一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
一般情况下函数调用会比宏的性能更差,但有例外的情况。现在很多RISC处理器(如SUN SPARC)使用寄存器窗口重叠技术,在寄存器充足的情况下,根本不需要堆栈操作,使得函数调用甚至会比宏快(如fgetc函数比getc宏更快)。
副作用的表达式
指的是表达式执行后,会改变表达式中某些变量的值 。(最简单的如++i,其中MACRO_SQRT(++i) 与 func_sqrt(++i)将是不同的。
#define MACRO_SQRT(x) (x)*(x) int func_sqrt(int x) { return x * x; }int a,b; /* 下面的代码是正常的 */ int i = 2; a = func_sqrt(++i); printf("a = %d, i = %d\n", a, i); /* 下面的代码则是不正常的 *代码看起来只是让i自加一次,但由于宏的原因,实际可能不止,因而用宏一般不要使用有“副作用”的表达式 * 宏会把所有的x替换成x*x,如果放入++i,那么编译器预处理的时候就会将所有的x替换成++i,可想而知会有多少个 * ++i出现在代码里面呢?又会自加多少次呢?这显然和我们想要的不一样。 */ i = 2; b = MACRO_SQRT(++i); printf("a = %d, i = %d\n", b, i);
取消宏定义
#undef就是取消一个宏的定义,之后这个宏就无效
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- [c/c++]宏定义,#,##
- C++/C 宏列表
- 【C/C++】宏
- C/C++-技巧-宏
- C/C++-技巧-宏
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- 免费申请基于飞腾硬件平台上的麒麟云试用!
- 寻找下一个大疆
- “奢华黑金,逆光清晰”vivo X20全面屏登陆北京国际摄影周!
- Windows Phone 宣告死亡,但为什么我们不感到遗憾?
- Java学习笔记--向上造型
- C/C++宏
- 动态规划 — LIS
- 响应式布局总结心得
- ubuntu 上两分钟搭建一个IRC server
- JavaEE学习之【List,Set集合底层的数据结构】
- [JSOI2008]星球大战
- 欢迎使用CSDN-markdown编辑器
- 在面试过程中SpringMVC常常被问到的有哪些知识点?
- PE头部的解析(总结于小甲鱼)