Действительно ли возможно отсортировать массивы с помощью препроцессора?

У меня есть много очень длинных массивов. Никакой вид во время выполнения не возможен. Это является также трудоемким для сортировки их вручную. Кроме того, новые элементы могут быть добавлены в порядке позже, таким образом, я хотел бы отсортировать их по значению с помощью C препроцессор или возможно существует какой-либо флаг компиляторов (GCC)?

Например:

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

должен быть отсортирован так:

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


РЕШЕННЫЙ

Хорошо, вот мое решение:

  1. Вручную copy&paste каждый массив во временный файл, названный tobesorted.c
  2. Отсортируйте его по 2-му столбцу: sort -b -i --key=2 tobesorted.c
  3. Вывод Copy&paste назад в исходный файл.

На самом деле было бы хорошо иметь некоторую возможность назвать "вид" непосредственно от препроцессора (у меня была надежда, что, по крайней мере, GCC так или иначе поддерживают такие функции, но кажется, что это не делает).

6
задан Brian Tompsett - 汤莱恩 23 February 2016 в 18:58
поделиться

4 ответа

Нет, это невозможно. Вы не можете выполнять строковые операции (кроме конкатенации) с препроцессором. И вы также не можете сравнивать строки с метапрограммированием шаблонов.

[edit] То, что вы могли бы сделать, - это поместить свою структуру данных в файл, который должен быть предварительно обработан внешним сценарием сборки (например, unix "sort"), а затем измените свой make-файл / проект так, чтобы во время сборки вы генерировали файл C с (отсортированными) инициализированными массивами

5
ответ дан 8 December 2019 в 12:58
поделиться

Я не думаю, что вы можете сделать это в препроцессор gcc, никогда не видел чего-то, что могло бы делать то, что вы ищете.

Но вы можете написать свой собственный «препроцессор» на вашем любимом языке сценариев (python, perl, sed и т. Д.), Который будет сортировать эти значения до того, как сработает gcc.

1
ответ дан 8 December 2019 в 12:58
поделиться

Сделайте следующее.

  1. Поместите ваш гигантский массив в файл.

  2. Отсортируйте файл с помощью встроенной sort

  3. Напишите небольшую программу для создания C-кода из файла. Программа на C, которая пишет программы на C, вполне подойдет. Вы можете использовать Python и некоторые из его классных пакетов шаблонов, чтобы упростить эту работу.

  4. Скомпилируйте оставшуюся программу, состоящую из отсортированного файла, преобразованного в C-код, и остальной части вашей программы.

11
ответ дан 8 December 2019 в 12:58
поделиться

Я не могу придумать возможности использовать препроцессор, но вы можете использовать комбинацию 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"
};
1
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: