Организация C-программы с множеством статических функций

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

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

Спасибо

РЕДАКТИРОВАТЬ

Для лучшего понимания проблемы здесь есть прямая ссылка на файл.c, где я испытываю трудности с управлением статическими функциями:

https://github.com/AntonioCS/mustache/blob/master/src/mustache.c

4 ответа

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

С большим набором функций, некоторые staticа некоторые нет, проблема может достигать сотен функций. Для управления этим пространством имен рассмотрим эти 2 подхода

  1. Разделить static функции на 2 группы: действительно static те, которые существуют только в одном файле.c, который нуждается в этом. Они используют static ключевое слово.

    Вторая группа функций, которые существуют в различных файлах.c, как и другие ваши глобальные функции. Они не используют static ключевое слово. Эти функции также должны начинаться с mustache_, Разница между этими и другими вашими глобальными функциями заключается в том, что включаемый файл, который их объявляет, является закрытым для вашего кода, а не общедоступным. Так что код имеет mustache.h а также mustache_private.h,

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

  2. Второй подход - использовать библиотечное управление вашими усами для управления именами, видимыми для остальной части кода. Это решение зависит от платформы / компилятора.

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

Если ваш проект скомпилирован (в Linux) в общую библиотеку (не исполняемую или статическую), вы можете использовать прагмы видимости и атрибуты функций. Вы хотите объявить все внутренние функции с hidden видимость Так что если ваш libaa.so составлен из a1.c а также a2.c с какой-то "скрытой" функцией h, тот h функция -объявлена ​​в каком-то закрытом заголовке, например: void h(int) __attribute__ ((visibility ("hidden"))); виден внутри a1.c (где это также может быть определено) a2.c но не внутри каких-либо внешних программных ссылок libaa.so...

Другие вопросы по тегам