c/c++语言开发共享是否可以使用预处理器对数组进行排序?

我有很多很长的数组。 无法进行运行时排序。 手动排序也很耗时。 此外,可以在以后以任何顺序添加新元素,因此我想使用C预处理器按值对它们进行排序,或者可能有任何编译器标志(GCC)?

例如:

sometype S[] = { {somevals, "BOB", someothervals}, {somevals, "ALICE", someothervals}, {somevals, "TIM", someothervals}, } 

必须排序如下:

 sometype S[] = { {somevals, "ALICE", someothervals}, {somevals, "BOB", someothervals}, {somevals, "TIM", someothervals}, } 

解决了

好的,这是我的解决方案:

实际上,有一种可能性直接从预处理器调用“排序”会很好(我希望至少GCC能以某种方式支持这些function,但似乎它没有)。

    不,这是不可能的。 您不能对预处理器执行字符串操作(串联除外)。 而且你也无法将字符串与模板元编程进行比较。

    [edit]你可以做的是将你的数据结构放在一个文件中,该文件由外部构建脚本(例如unix“sort”实用程序)预处理,然后修改你的makefile /项目,这样你在生成时就会生成带有(已排序)初始化数组的C文件

    做这个。

    我不认为你可以在gcc预处理器中做到这一点,从未见过可以做你正在寻找的东西。

    但是你可以用自己喜欢的脚本语言(python,perl,sed等……)编写自己的“预处理器”,在gcc启动之前对这些值进行排序。

    我认为不可能使用预处理器,但您可以使用sort#include的组合来实现所需的效果:

    将值放入单独的文件values.h ,排序键位于前面 (您需要为此重新排列struct sometype ):

     {"BOB", somevals, someothervals}, {"ALICE", somevals, someothervals}, {"TIM", somevals, someothervals}, 

    在Makefile中,使用Unix命令sort将该文件排序为values_sorted.h

     sort < values.h > values_sorted.h 

    在您的实际代码中,包括已排序的文件:

     sometype S[] = { #include "values_sorted.h" }; 

    以下内容适用于两个和三个要素:

     // Experiment: static sort: #define STATIC_SORT2(CMP, a, b) CMP(a,b) <= 0 ?(a):(b), CMP(a,b) <= 0 ? (b):(a), #define STATIC_SORT3(CMP, a, b, c)  (CMP(a,b) <= 0 && CMP(a,c) <= 0 ? (a) :  CMP(b,a) <= 0 && CMP(b,c) <= 0 ? (b) :  (c)),  (CMP(a,b) <= 0 && CMP(a,c) <= 0 ? ( CMP(b,c) <= 0 ? (b) : (c) ) :  CMP(b,a) <= 0 && CMP(b,c) <= 0 ? ( CMP(a,c) <= 0 ? (a) : (c) ) :  (CMP(a,b) <= 0 ? (a) : (b))),  (CMP(a,c) <= 0 && CMP(b,c) <= 0 ? (c) :  CMP(a,b) <= 0 && CMP(c,b) <= 0 ? (b) :  (a)) // Example: // #define STATIC_INT_CMP(a,b) ((int)(a) - (int)(b)) // int sorted[] = { STATIC_SORT3(STATIC_INT_CMP, 2, 3, 1 } // gives { 1, 2, 3 } // #define STATIC_INT_COCMP(a,b) ((int)(b) - (int)(a)) // int cosorted[] = { STATIC_SORT3(STATIC_INT_COCMP, 2, 3, 1 } // gives { 3, 2, 1 } 

    但我要说很明显,这种方法并没有推广到任意大小的数组。 我想这是不可能的,但我仍然没有这个猜想的正式证据。

      以上就是c/c++开发分享是否可以使用预处理器对数组进行排序?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560032.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐