• 18 # 和 ##


    1 # 运算符

    • # 运算符用于在预处理期将宏参数转换为字符串

    • # 的转换作用是在预处理期完成的,因此只在宏定义中有效

    • 编译器不知道# 的转换作用

    • 用法

      #include <stdio.h>
      
      #define STRING(x) #x
      
      int main()
      {
          
          printf("%s
      ", STRING(Hello world!));
          printf("%s
      ", STRING(100));
          printf("%s
      ", STRING(while));
          printf("%s
      ", STRING(return));
      
          return 0;
      }
      
      //输出结果
      Hello world!
      100
      while
      return
      
    • 示例

      #include <stdio.h>
      
      //动态打印被调用函数的函数名
      #define CALL(f, p) (printf("Call function %s
      ", #f), f(p))
         
      int square(int n)
      {
          return n * n;
      }
      
      int func(int x)
      {
          return x;
      }
      
      int main()
      {
          int result = 0;
          
          result = CALL(square, 4);
          
          printf("result = %d
      ", result);
          
          result = CALL(func, 10);
          
          printf("result = %d
      ", result);
      
          return 0;
      }
      
      //运行结果
      Call function square
      result = 16
      Call function func
      result = 10
      
      • 单步编译:gcc -E test.c -o test.i

        int square(int n)
        {
            return n * n;
        }
        
        int func(int x)
        {
            return x;
        }
        
        int main()
        {
            int result = 0;
            
            result = (printf("Call function %s
        ","square"),square(4));
            
            printf("result = %d
        ", result);
            
            result = (printf("Call function %s
        ","func"),func(10));
            
            printf("result = %d
        ", result);
        
            return 0;
        }
        

    2 ## 运算符

    • ## 运算符用于在预处理期粘贴两个标识符

    • ## 的连接作用是在预处理期完成的,因此只在宏中有效

    • 编译器不知道## 的连接作用

    • 用法

      #define CONNECT(a,b) a##b
      int CONNECT(a,1);  //int a1;
      a1 = 2;
      
    • 示例1

      #include <stdio.h>
      
      #define NAME(n) name##n
      
      int main()
      {
          
          int NAME(1);
          int NAME(2);
          
          NAME(1) = 1;
          NAME(2) = 2;
          
          printf("%d
      ", NAME(1));
          printf("%d
      ", NAME(2));
      
          return 0;
      }
      //输出结果
      NAME1 = 1
      NAME2 = 2
      
    • 示例2

      • 解决定义完结构体后,每次生成一个结构体变量都需要使用 struct 关键字的问题
      #include <stdio.h>
      
      #define STRUCT(type) typedef struct _tag_##type type;
                           struct _tag_##type
      
      STRUCT(Student)
      {
          char* name;
          int id;
      };
      
      int main()
      {
          
          Student s1;
          Student s2;
          
          s1.name = "s1";
          s1.id = 0;
          
          s2.name = "s2";
          s2.id = 1;
          
          printf("s1.name = %s
      ", s1.name);
          printf("s1.id = %d
      ", s1.id);
          printf("s2.name = %s
      ", s2.name);
          printf("s2.id = %d
      ", s2.id);
      
          return 0;
      }
      
  • 相关阅读:
    「程序员思维训练」1. 读前声明
    获取apk的MD5或SHA1签名信息
    随用随记:超图小tips(长期更新ing)
    ajax上传大附件报错:413 Request Entity Too Large
    利用input file 上传文件调用ajax保存到服务器(含后台代码)
    软工课程总结
    开发体验心得总结
    结对项目 稳定版四则运算系统
    Week3 关于“微软必应词典客户端”的案例分析
    Week2 代码复查
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13646513.html
Copyright © 2020-2023  润新知