zoukankan      html  css  js  c++  java
  • 宏定义中#和##符号的使用和宏定义展开问题

    程序如下:

    #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)

    说明:

    1、关于符号#和##

      两个符号都只能用于预处理宏扩展。不能在普通的源码中使用它们,只能在宏定义中使用。

      简单的说,#是把宏参数变为一个字符串,##是把两个宏参数连接在一起

    2、关于宏展开

    预处理过程的几个步骤:

    1)字符集转换(如三联字符)

    2)断行链接/

    3)注释处理,/* comment */,被替换成空格

    4)执行预处理命令,如#inlcude、#define、#pragma、#error等

    5)转义字符替换

    6)相邻字符串拼接

    7)将预处理记号替换为词法记号

    第4)步即如何展开宏函数的规则:在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。

  • 相关阅读:
    英语4月测试题
    Hadoop---集群的时间同步
    Hadoop---日志服务器
    Hadoop---桥接集群的搭建
    HDFS
    虚拟机类加载机制
    Hadoop---集群的搭建(仅主机模式)
    YARN
    垃圾收集算法和垃圾收集器
    Hadoop---HDFS读写流程
  • 原文地址:https://www.cnblogs.com/renyuan/p/6603351.html
Copyright © 2011-2022 走看看