У меня есть много очень длинных массивов. Никакой вид во время выполнения не возможен. Это является также трудоемким для сортировки их вручную. Кроме того, новые элементы могут быть добавлены в порядке позже, таким образом, я хотел бы отсортировать их по значению с помощью C препроцессор или возможно существует какой-либо флаг компиляторов (GCC)?
Например:
sometype S[] = {
{somevals, "BOB", someothervals},
{somevals, "ALICE", someothervals},
{somevals, "TIM", someothervals},
}
должен быть отсортирован так:
sometype S[] = {
{somevals, "ALICE", someothervals},
{somevals, "BOB", someothervals},
{somevals, "TIM", someothervals},
}
Хорошо, вот мое решение:
sort -b -i --key=2 tobesorted.c
На самом деле было бы хорошо иметь некоторую возможность назвать "вид" непосредственно от препроцессора (у меня была надежда, что, по крайней мере, GCC так или иначе поддерживают такие функции, но кажется, что это не делает).
Нет, это невозможно. Вы не можете выполнять строковые операции (кроме конкатенации) с препроцессором. И вы также не можете сравнивать строки с метапрограммированием шаблонов.
[edit] То, что вы могли бы сделать, - это поместить свою структуру данных в файл, который должен быть предварительно обработан внешним сценарием сборки (например, unix "sort"), а затем измените свой make-файл / проект так, чтобы во время сборки вы генерировали файл C с (отсортированными) инициализированными массивами
Я не думаю, что вы можете сделать это в препроцессор gcc, никогда не видел чего-то, что могло бы делать то, что вы ищете.
Но вы можете написать свой собственный «препроцессор» на вашем любимом языке сценариев (python, perl, sed и т. Д.), Который будет сортировать эти значения до того, как сработает gcc.
Сделайте следующее.
Поместите ваш гигантский массив в файл.
Отсортируйте файл с помощью встроенной sort
Напишите небольшую программу для создания C-кода из файла. Программа на C, которая пишет программы на C, вполне подойдет. Вы можете использовать Python и некоторые из его классных пакетов шаблонов, чтобы упростить эту работу.
Скомпилируйте оставшуюся программу, состоящую из отсортированного файла, преобразованного в C-код, и остальной части вашей программы.
Я не могу придумать возможности использовать препроцессор, но вы можете использовать комбинацию 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"
};