【问题标题】:Declaring a variable of type t in a macro in C在 C 中的宏中声明 t 类型的变量
【发布时间】:2012-09-08 15:00:45
【问题描述】:

我需要在 C 中定义一个宏来执行以下操作。

swap_m(t,x,y) 交换 xy 类型的两个参数 t

我不太确定如何将xy 设置为输入t。这可能真的很简单,但我是 C 新手,不太确定该怎么做。

【问题讨论】:

  • 为什么你会为此写一个宏?使用通过临时变量交换值的简单函数。任何体面的编译器都会知道你在做什么,并生成最有效的机器代码来交换这两个值。如果您在该任务上没有获得满分没有严重的缺点提交一个不会滥用宏的解决方案并提供适当的解释。
  • t 对于xy 不是必需的:它们已经有一个类型。请记住,宏只是代码中的替代品。 没有宏你会怎么做呢?一旦你能回答这个问题,t 的需求可能就更清楚了。
  • 提示:开始为 T 类型的对象创建交换函数

标签: c types macros


【解决方案1】:

【讨论】:

    【解决方案2】:

    你可以利用 memcpy 和 sizeof 操作符:

    void __swap(void* a, void* b, size_t size)
    {
        void* temp= malloc(size);
        memcpy(temp,a,size);
        memcpy(a,b,size);
        memcpy(b,temp,size);
        free(temp);
    }
    
    #define swap(a,b) __swap(&a,&b,sizeof(a))
    

    【讨论】:

    • 这有很大的问题。例如,如果这种类型是一个结构,其中包含指向自身内部其他结构的指针怎么办?
    【解决方案3】:

    您只需将类型传递为t,例如swap_m(int, x, y).

    然后你可以在你的宏中定义一个t类型的变量:

    #define swap_m(TYPE, X, Y)    do { TYPE ___tmp = X; X = Y; Y = ___tmp; } while(0)
    

    【讨论】:

      【解决方案4】:

      试试

      #define SWAP(x, y, t) \
          do {
              t __temp = x;
              x = y;
              y = __temp;
          } while (0)
      

      用作

      int a = 1, b = 2;
      SWAP(a, b, int);
      

      【讨论】:

      • 反对者:原因?我的回答在技术上不正确?不应该有其他理由拒绝投票。还是我的回答被视为垃圾邮件?请回复!我无法忍受无法解释的连续投票!
      • @oldrinb 是的,我也看到了,恕我直言,这是非常不公正的。他一定是个烦人的人……
      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2011-04-25
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多