易出错的C语言题目之一:宏定义与预处理

1、写出下列代码的运行结果:

#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(var2,var1);

    printf("var1 = %s/n",var1_p);
    printf("var2 = %s/n",var2_p);

    printf("\n");

    return 0;
}

答案:

var1 = var2/nvar2 = var1/n

解析:

#为字符串化操作符,将所连接的部分转化为一个字符串,##为字符串连接符,将两个字符串连接成一个字符串,均在预处理时完成字符串的替换。

2、写出下列代码的运行结果:

#include<stdio.h>

#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)

int main(){
    printf("%s\n",h(f(1,2)));
    printf("%s\n",g(f(1,2)));
    return 0;
}

答案:

12
f(1,2)

解析:

本题考察字符串化操作符#得作用得执行过程,以及宏定义替换的次序。如果该宏为带#号的宏定义,则直接替换字符串,无需再嵌套替换,如果该宏不是带#的宏,则先替换括号内部的宏定义,然后替换外部的。

3、定义一个宏,求一个结构体struct中某个变量相对于struct的偏移量

答案:

#define OFFSET(struct, member)  ((unsigned int)&((struct *)0)->member)

posted @ 2016-02-26 16:59  AndyJee  阅读(1250)  评论(0编辑  收藏  举报