我想创建一个C宏,返回输入中任何类型的静态数组的标量最小值。例如:
float A[100];
int B[10][10];
// [...]
float minA = MACRO_MIN(A);
int minB = MACRO_MIN(B);
我该怎么办?
答案 0 :(得分:1)
可能可能使用GCC扩展,但不能在标准C中完成。其他编译器也可能具有合适的扩展。它当然会使代码非常难以移植。我会建议反对它,因为它很难实现它将是“意外的”,并可能成为混乱(或更糟糕的是,错误)的原因。
当迭代数组时,您将不得不声明一个临时变量来保持“到目前为止”看到的最大/最小值,并且该变量的类型很难在没有扩展的情况下形成。
同样返回临时值很难,但可以使用GCC扩展。
为了使上述内容更加具体,这里是我想象的草图。我做了不测试编译这个,所以它很可能有错误:
#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
当然是标准的。
正如我上面写的那样,我意识到可能存在多维数组的问题,直到尝试才能实现。不过,我不打算进一步改进它。请注意,它以“可能”开头。