【发布时间】:2015-05-29 21:28:15
【问题描述】:
是否可以在 C 编译时对元素进行排序?
语法是次要的,我在想这样一个宏:
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 个元素进行排序。
我意识到解决方案可能会求助于一些几乎无法编译的语言巫术,我只是想知道它是否可能。
【问题讨论】:
-
我称之为预处理器。基本上,您编写一个解析器,在调用编译器之前修改源代码。要么这样,要么只是手动整理东西。
-
我认为你可以在 C++14 中使用可变参数模板来实现。但在纯 C 语言中,我不这么认为。
-
您可以在 C 中使用不同的宏函数来执行此操作,以使用 ?: 语法在每个
i位置获取每个n元素。但我认为它不会在编译时使用字符串进行评估。int应该被评估,但实际上没有办法强制编译器不使用 const_expr。 -
如果Boost.Preprocessor做不到,那估计也做不到了。
-
Having to call SORT_5 to sort 5 elements is OK然后你可以手动写SORT_5():你可以用完全不可读的? :链来做。 (不完全是预处理器排序,但如果参数是常量,它可能会在编译时进行评估。)或者编写一个程序为你生成SORT_2..50()。
标签: c sorting compile-time