• 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;
      }
      
  • 相关阅读:
    给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组以及删除了重复条目的原数组。
    mysql批量替换某个字段的值!
    LInux常用命令
    盒模型布局
    box-sizing -- 盒模型
    vue中使用svg字体图标
    字体图标
    在线字体
    Java QQ邮箱发送邮件
    Java 对全局用户是否登录验证
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13646513.html
Copyright © 2020-2023  润新知