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就是取消一个宏的定义,之后这个宏就无效

 


 

 

原创粉丝点击