Функция переупорядочения в файле c на основе файла заголовка c

Есть ли какой-либо инструмент для автоматической переупорядочивания файла .c на основе .h?

Например, foo.h

void function1();
void function2();
void function3();

И foo.c

void function2(){}
void function1(){}
void function3(){}

Могу ли я переупорядочить его как

void function1(){}
void function2(){}
void function3(){}

Кстати, я использую Vim в Ubuntu.

Ответы

Ответ 1

Я не верю, что есть такой инструмент. В С порядок декларирования и определения вообще не имеет значения. Конечно, существует исключение цикла зависимостей (a() вызывает b(), который вызывает a()), но когда функции объявлены в файле заголовка, даже это не проблема, так как все объявления фактически являются "вперед", необходимые для обработки циклов зависимостей.

Таким образом, порядок определений в блоке трансляции по существу является вопросом вкуса и стиля. Таким образом, это не особенность, которую дизайнеры-редакторы склонны решать, поскольку усилия по созданию функций, общих и достаточно мощных, чтобы быть полезными для преобладания пользователей, могут считаться непомерно большими. Подумайте, сколько времени потребовалось для (не программируемых) редакторов, которые обычно имеют гибкие и мощные функции автоматического отступов и переформатирования.

Существует также риск нарушения логики, грамматики или удобочитаемости кода при его реорганизации автоматически. Например, если комментарии лежат между определениями функций, как инструмент узнает, идет ли комментарий с определенной функцией или с группой функций или с помощью функции выше? И как @Yuri упоминает выше, что относительно функций внутри # if/# else/# endif блоков? А как насчет тонких случаев, таких как макросы, которые расширяются до функций или директив #include, зажатых между определениями функций? Я полагаю, что функция переупорядочения может ограничивать свой домен простым случаем, но если дело становится слишком простым, его апелляция соответственно ограничена и не публикуется публично или широко.

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