zoukankan      html  css  js  c++  java
  • 易出错的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("
    ");
    
        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
    ",h(f(1,2)));
        printf("%s
    ",g(f(1,2)));
        return 0;
    }

    答案:

    12
    f(1,2)

    解析:

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

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

    答案:

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

  • 相关阅读:
    php 数组
    条件语句if else ,switch ,while ,do.while
    if..else 判断中的 Boolean()转换
    wampserver 集成环境
    sublime text 安装及使用
    vue tab切换
    SVG 基础
    gitosis管理员的密钥丢失解决办法
    源码安装MySQL
    Xshell远程登录
  • 原文地址:https://www.cnblogs.com/AndyJee/p/5220981.html
Copyright © 2011-2022 走看看