2014-09-18 4 views
1

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

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

Благодаря

EDIT

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

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

+0

Я не думаю, что нет ничего плохого в том числе файлов. – 5gon12eder

+0

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

+0

@ 5gon12eder, технически нет, однако, как правило, он недоволен включением кода. –

ответ

3

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

+0

Это хорошая идея, особенно с GNU Automake. – 5gon12eder

0

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

+0

Что ты говоришь? Я должен просто перейти на C++, чтобы помочь мне со статическими функциями? – AntonioCS

+0

@ AntonioCS, я просто предлагаю вам улучшить организацию с помощью C++, если это технически возможно для вас. Я видел, что C-программы выходят за пределы управления с помощью 10 000 строк кода и файлов, которые имеют 1000 строк кода, каждый из которых имеет статические вызовы. При правильной ориентации объектов вы можете создавать классы, которые инкапсулируют методы (функции) и данные, которые они могут быть использованы для & ничего более. – cyber101

1

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

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

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^