首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C能在编译时排序吗?

C能在编译时排序吗?
EN

Stack Overflow用户
提问于 2015-03-25 23:53:18
回答 3查看 1K关注 0票数 6

可以在编译时用C对元素排序吗?

语法是次要的,我想到了这样一个宏:

代码语言:javascript
复制
SORT(9, -1, 12, 4)   // expands to: -1, 4, 9, 12
SORT(dog, cat, cow)  // expands to: cat, cow, dog

但是我不会对任何API皱眉,只要它不发出一个CPU指令就可以排序。

要求相当宽松:

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

我意识到这个解决方案可能会求助于一些几乎无法编译的语言巫毒,我只是想知道它是否可能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-26 00:32:39

下面是一个宏方法:

代码语言:javascript
复制
#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]);
}

这适用于int,也适用于C语言,但是没有const_expr来自C++的字符串是不可能的。显然,您需要大量的宏编写来支持大量的SORT_X

票数 7
EN

Stack Overflow用户

发布于 2015-03-26 00:38:51

让我们考虑排序只能是0或1的数字。对于两个数字,下面代码中的SORT2可以对它们进行排序:

代码语言:javascript
复制
#define SORT2(a,b) SORT2_##a##b
#define SORT2_00 0,0
#define SORT2_01 0,1
#define SORT2_10 0,1
#define SORT2_11 1,1

当然,这可以扩展到更大的范围和更多的参数。

票数 3
EN

Stack Overflow用户

发布于 2015-03-29 10:15:19

实际上,您不能在编译时对C进行排序(至少如果您希望排序足够多的编译时常量整数;在这种情况下,有300个宏或函数名为SORT_1SORT_2、. SORT_300是不实际的,除非您生成这些函数或宏,而您不想这样做).

实用的方法是使用您自己的或其他的预处理程序(例如gpp),并让它进行排序。或者简单地说,在包含的文件中包含数字并生成排序的文件(例如,使用make规则使用awk & sort)

您还可以考虑使用链路时间优化链接到LTO编译的libc,使用其LTO优化的qsort。这并不常见,AFAIK,您不能保证编译器是智能的-足够内联您的LTO qsort等.(AFAIK,当前的C编译器不这样做)。

如果使用最新的GCC进行编译(2015年3月使用4.8、4.9或5.0 ),您可以定制它(例如使用熔化或自己的C++插件)来定义您的__builtin_my_compile_time_sort (或者某些_Pragma)来完成这项工作。这是编译器特有的(可能意味着几天的工作,除非您已经知道了)

最简单的事情是接受稍微复杂的构建步骤。这没什么大不了的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29268723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档