C可以在编译时排序吗?

Tom*_*ski 6 c sorting compile-time

是否可以在C中编译时对元素进行排序?

语法是次要的,我正在考虑这样的宏:

SORT(9, -1, 12, 4)   // expands to: -1, 4, 9, 12
SORT(dog, cat, cow)  // expands to: cat, cow, dog
Run Code Online (Sandbox Code Playgroud)

但是我不会对任何API皱眉,只要它排序而不发出单个CPU指令.

要求非常宽松:

  • 纯C,没有C++.保持在C标准内会很好,但已建立的语言扩展是公平的游戏.
  • 编译器是唯一允许的工具.Unix sort或自制的代码生成器不受欢迎,因为它们使构建步骤复杂化.
  • 任何元素类型都可以.如果它可以排序例如数字而不是字符串,那就没关系.
  • 固定长度的API很好.必须调用SORT_5sort 5元素才行.

我意识到解决方案可能会使用一些几乎没有编译的语言巫术,我只是想知道它是否可能.

Voi*_*tar 7

这是一个宏观方法:

#define GET_1_of_3(a, b, c) ((a) < (b) ? ((c) < (a) ? (c) : (a)) : ((c) < (b) ? (c) : (b)))
#define GET_2_of_3(a, b, c) ((c) > (a) && (c) < (b) || (c) < (a) && (c) > (b) ? (c) : ((b) > (a) && (b) < (c) || (b) < (a) && (b) > (c) ? (b) : (a)))
#define GET_3_of_3(a, b, c) ((a) > (b) ? ((c) > (a) ? (c) : (a)) : ((c) > (b) ? (c) : (b)))
#define SORT_3(a, b, c) GET_1_of_3(a, b, c),GET_2_of_3(a, b, c),GET_3_of_3(a, b, c)

void main(){
    int x[3] = { SORT_3(6,2,3) };
    printf("%d, %d, %d", x[0], x[1], x[2]);
}
Run Code Online (Sandbox Code Playgroud)

这适用int于C并且在C中工作,但是没有const_exprC++的字符串是不可能的.显然,你正在进行大量的宏写作以支持大量的SORT_X.