【问题标题】:Create a min() macro for any type of array为任何类型的数组创建一个 min() 宏
【发布时间】:2013-12-16 09:13:13
【问题描述】:

我想创建一个 C 宏,为输入中的任何类型的静态数组返回标量最小值。例如:

float A[100];
int B[10][10];
// [...]
float minA = MACRO_MIN(A);
int minB = MACRO_MIN(B);

我该怎么做?

【问题讨论】:

  • 不,你不能,你为什么还要呢?如果您想要这种功能,请使用 C++。
  • 您需要的不仅仅是数组作为宏的参数,例如元素的类型和数量。
  • 对于简单的数组,这应该是相当简单的。但我认为你不能为多维数组做到这一点,因为你不能“重载”宏。
  • 谢谢你,Kerrek,Eregrith。你完全理解我的问题:一维数组应该是可能的,问题是,确实,是否可以在没有更多参数的情况下创建这样的宏。
  • 查看this question on pseudo-generics in C。它与您的问题具有相似的目标,并且其中一些答案很有启发性。

标签: c c99 c-preprocessor


【解决方案1】:

它可以可能使用 GCC 扩展来完成,但不能在标准 C 中完成。其他编译器也可能有合适的扩展。它当然会使代码非常难以移植。我建议不要这样做,因为它很难实现,它会“出乎意料”并且可能会成为混乱的根源(或者更糟糕的是,错误)。

在遍历数组时,您将不得不声明一个临时变量来保存“到目前为止”看到的最大/最小值,并且该变量的类型很难在没有扩展的情况下制定。

返回临时值也很困难,但可以通过 GCC 扩展来实现。

为了使上述内容更具体,这是我想象的草图。我做了 not 测试编译这个,所以它很可能有错误:

#define ARRAY_MAX(a)  ({ typeof(a) tmp = a[0];\
                         for(size_t i = 1; i < sizeof a / sizeof tmp; ++i)\
                         {\
                           if(a[i] > tmp)\
                             tmp = a[i];\
                         }\
                         tmp;\
                      })

以上用途:

  • ({})GCC Statement Expressions 扩展,允许宏具有用作“返回值”的局部变量。
  • typeof 用于计算正确的类型。
  • 请注意数组大小不为零的假设。这不应该是一个非常有限的假设。

sizeof 的使用当然是标准的。

正如我在上面写的那样,我意识到多维数组可能存在一些我直到尝试才意识到的问题。不过,我不会进一步完善它。请注意,它以“可能”开头。

【讨论】:

  • 使用 GCC 扩展如何区分一维和多维?
  • @BLUEPIXY 不确定是否可以。但是您可能会忽略这一点(假设它是一个真正的多维数组并且不是锯齿状的)并使用sizeof 来计算元素的总数。
  • 从我知道的整体sizeof的大小中可以看出,但是,如果传递多维数组,我认为宏需要一种元素类型。
  • 可能,不可能得出结论。它也有错字。
  • @BLUEPIXY 谢谢,我想我修正了错字(语句表达式大括号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2020-11-19
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多