是否可以使用嵌套函数/块编写可移植C代码?
我知道gcc只支持嵌套函数作为非标准扩展,而clang只支持块 - 但是有没有办法编写可以使用标准C和MACROS进行编译的代码?
如果不可能 - 最好的工作是什么?举个例子,如何实现一个带参数的以下类型的可移植版本?海湾合作委员会的简单例子:
int main(int argc, char*[] argv)
{
char reverse = 0;
int cmp_func(const void *a, const void *b)
{
const int* aa = (const int)a;
const int* bb = (const int)b;
return (reverse) ? aa - bb : bb - aa;
}
int list[8] = {1,2,3,4,5,20,100,200};
qsort(list, 8, sizeof(int), &cmp_func);
}
Run Code Online (Sandbox Code Playgroud)
可以使用Clang中的Blocks将类似示例放在一起.理想情况下,解决方案应该是线程安全的(因此避免使用全局变量).
编辑:为清楚起见,我们假设"标准"表示C99.以上是一个简单的例子.我所追求的是一种需要一些参数的C99方法.这里它只使用一个char作为布尔值,但我正在使用一个可以采用多个整数等的解决方案.看起来如果没有全局变量,这可能是不可能的.
编辑2:我意识到将void指针与函数指针一起传递使您可以执行可以使用嵌套函数完成的所有操作.感谢@Quuxplusone的建议qsort_r和qsort_s.我试图拼凑在便携式包装qsort_r和qsort_s.它需要一个比较器函数和一个用于存储状态的void指针,从而消除了对复杂排序算法的嵌套函数的依赖性 - 因此您可以使用GCC和Clang进行编译.
typedef struct
{
void *arg;
int (*compar)(const void …Run Code Online (Sandbox Code Playgroud)