易出错的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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值