是否可以在C中编译时对元素进行排序?
语法是次要的,我正在考虑这样的宏:
SORT(9, -1, 12, 4) // expands to: -1, 4, 9, 12 SORT(dog, cat, cow) // expands to: cat, cow, dog
但是我不会对任何API皱眉,只要它排序而不发出单个CPU指令。
要求非常宽松:
我意识到解决方案可能会使用一些几乎没有编译的语言巫术,我只是想知道它是否可能。
这是一个宏观方法:
#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中工作,但是对于没有来自C ++的const_expr
字符串是不可能的。 显然,你需要进行大量的宏写操作才能支持大量的SORT_X
。
让我们考虑排序只能是0或1的数字。对于两个数字,以下代码中的SORT2
可以对它们进行排序:
#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
这当然可以扩展到更大的范围和更多的论点。
不是真的,你不能在编译时在C中排序(至少如果你想排序足够多的编译时常量整数;在这种情况下有300个宏或函数名为SORT_1
, SORT_2
,… SORT_300
不是实际上,除非你生成这些你不想要的函数或宏,但….
实用的方法是使用你自己的或其他一些预处理器(例如gpp )并让它进行排序。 或者简单地说,在一些包含的文件中包含数字并生成该排序文件(例如,使用awk
和sort
的make
规则)
您还可以考虑使用其LTO优化的qsort
将链接时优化链接到LTO编译的libc 。 这通常不是AFAIK,你不能保证编译器足够智能 – 足以内嵌你的LTO qsort
等……(AFAIK,当前的C编译器不这样做)。
如果使用最近的GCC (2015年3月4.8或4.9或5.0)进行编译,您可以自定义它(例如使用MELT或使用您自己的C ++插件)来定义__builtin_my_compile_time_sort
(或者某些_Pragma
)来完成这项工作。 这是编译器特定的(可能意味着几天的工作,除非你已经知道MELT)
最简单的方法是接受稍微复杂的构建步骤。 这不是什么大不了的事。
以上就是c/c++开发分享C可以在编译时排序吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559989.html