1、为了调用宏时能得到正确结果,在宏体中建议对宏的每个参数用括号括起来,并且当宏体是一个表达式时整个宏体也用括号括起来。
/* c1.c:将两个数相乘 */
#define product(x,y) ((x)*(y))
#include <stdio.h>
int main(){
int a=1,b=2,c=3,d=4,x=0;
x=product(a+3,b)+product(c,d); /* 若宏体中没有使用括号,则得不到
你想要的结果 */
printf("%d\n",x);
return 0;
}
2、用宏来插入任意语句。
/* c2.c:插入任意语句 */
#define insert(stmt) stmt /* 插入任意语句 */
#include <stdio.h>
int main(){
int a,b;
insert({ a=1;b=1; }) /* 这是一个复合语句 */
insert({ a=1,b=1; }) /* 如果逗号表达式不用圆括号括起,则预处理器会认为
有两个实参,报错 */
printf("a=%d, b=%d\n",a,b);
return 0;
}
注意,第2个调用中逗号表达式语句要用括号括起来,否则预处理器会认为给宏传了两个实参,由于没有两个实参的incr,因此会报错。
3、为了使函数式宏能像真正的函数一样工作,建议用do{ }while(0)语句包住宏体的代码。
/* c3.c: 交换两个整型变量的值 */
/* #define swap(x,y) { int temp=x; x=y; y=temp; } */
#define swap(x,y) \
do { int temp=x; x=y; y=temp; } while(0)
#include <stdio.h>
int main(){
int x=4,y=3;
if(x>y) swap(x,y); /* 用第一个swap时会出错,导致{ }后面有一个分号,
用第二个swap则没问题 */
else x=y;
printf("x=%d, y=%d\n",x,y);
return 0;
}
如果用注释中定义那个swap,则if {...};后面会一个分号,单独的分号是一个空语句,这导致if与else之间有两个单独的语句不合法。而用do{ }while(0)套住语句时则不会有这样的问题。
4、用宏来包装语句。
/* c4.c:打印1到20的立方表,用宏来包装循环语句 */
#define incr(v,low,high) \
for((v)=(low); (v)<=(high); (v)++)
#include <stdio.h>
int main(){
int j;
incr(j,1,20)
printf("%2d %6d\n",j,j*j*j);
return 0;
http://topic.csdn.net/u/20080924/15/3b00a84e-970f-4dea-92f2-868c5d1ad825.html?52694
前段时间刚参加了n多公司的C/C++软件工程师的面试,有国企,外企,私企(moto,飞思卡尔,港湾,中国卫星XXX(这个牛))等等等等。感受感想颇多,近日终于空闲,在此表述一下。
本人基本条件:3年开发经验,2year+ ......