Организация C-программы с множеством статических функций
Я работаю над личным проектом и хочу только выставить функцию 3 или 4. Одной из проблем этого является то, что мой файл.c получает все больше статических функций. В настоящее время у него уже есть 21 статическая функция.
Как лучше организовать файл.c, содержащий много статических функций? Можно ли (хорошая практика) разделить эти статические функции на их собственные файлы.c, а затем просто включить их в основной файл.c? Я бы предпочел подход, при котором у меня мог бы быть отдельный файл, чтобы было проще переходить от одной функции к другой (без прокрутки, просто переключаясь между файлами).
Спасибо
РЕДАКТИРОВАТЬ
Для лучшего понимания проблемы здесь есть прямая ссылка на файл.c, где я испытываю трудности с управлением статическими функциями:
https://github.com/AntonioCS/mustache/blob/master/src/mustache.c
4 ответа
В том числе может работать, чтобы разделить большой блок компиляции на несколько файлов. Тем не менее, я настоятельно не рекомендую называть включенные файлы .c
потому что это расширение указывает на отдельный модуль компиляции как для инструментов, так и для других разработчиков. Подумайте, как их назвать .inl
вместо.
С большим набором функций, некоторые static
а некоторые нет, проблема может достигать сотен функций. Для управления этим пространством имен рассмотрим эти 2 подхода
Разделить
static
функции на 2 группы: действительноstatic
те, которые существуют только в одном файле.c, который нуждается в этом. Они используютstatic
ключевое слово.Вторая группа функций, которые существуют в различных файлах.c, как и другие ваши глобальные функции. Они не используют
static
ключевое слово. Эти функции также должны начинаться сmustache_
, Разница между этими и другими вашими глобальными функциями заключается в том, что включаемый файл, который их объявляет, является закрытым для вашего кода, а не общедоступным. Так что код имеетmustache.h
а такжеmustache_private.h
,Это технически загрязняет глобальное пространство имен, но поскольку пользователь ваших "усовых" объектов, как правило, должен избегать столкновений с любым объектом, начинающимся с
mustache_
Не будет никакого удивительного конфликта с этими "частными" функциями.Второй подход - использовать библиотечное управление вашими усами для управления именами, видимыми для остальной части кода. Это решение зависит от платформы / компилятора.
Организация программы на 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
...