Введение
Привет, ребята, я недавно научился программировать на C! (Это был огромный шаг для меня, поскольку С++ был первым языком, с которым я связался и напугал меня почти 10 лет.) Исходя из основного фона OO (Java + С#), это был очень приятный сдвиг парадигмы.
Я люблю C. Это такой красивый язык. Что меня больше всего удивило, это высокий уровень модульности и поддержки повторного использования кода C - конечно, это не так высоко, как на языке OO, но все же далеко за пределами моих ожиданий относительно императивного языка.
Вопрос
Как предотвратить конфликты имен между клиентским кодом и кодом библиотеки C? В Java есть пакеты, на С# есть пространства имен. Представьте себе, что я пишу библиотеку C, которая предлагает операцию "добавить". Весьма вероятно, что клиент уже использует операцию, называемую так: что мне делать?
Я особенно ищу дружелюбное решение. Например, я не хотел бы префикс всех моих операций api, таких как myuniquelibname_add. Каковы общие решения этого в мире C? Вы помещаете все операции api в структуру, поэтому клиент может выбрать собственный префикс?
Я очень с нетерпением жду того, как я получаю ответы на ваши вопросы!
EDIT (измененный вопрос)
Уважаемые участники, спасибо за ваши ответы! Теперь я вижу, что префиксы - единственный способ безопасно избежать конфликтов имен. Итак, я хотел бы модифицировать мой вопрос: Какие у меня есть возможности, чтобы клиент мог выбрать свой префикс?
Ответ Unwind, это один из способов. Он не использует префиксы в обычном смысле, но нужно приписать каждый api-вызов "api- > ". Какие существуют другие решения (например, с использованием #define)?
EDIT 2 (обновление статуса)
Все это сводится к одному из двух подходов:
- Использование структуры
- Использование #define (примечание: существует много способов, как можно использовать #define для достижения, чего я хочу)
Я не буду принимать никакого ответа, потому что я думаю, что нет правильного ответа. Решение, которое выбирается, зависит от конкретного случая и от собственных предпочтений. Я, сам по себе, опробую все подходы, которые вы упомянули, чтобы узнать, что мне подходит лучше всего в этой ситуации. Не стесняйтесь публиковать аргументы за или против определенных оценок в комментариях соответствующих ответов.
Наконец, я хотел бы особо поблагодарить:
- Unwind - за его сложный ответ, включая полную реализацию "структурного метода"
- Christoph - за его хороший ответ и указав на Пространства имен в C
- Все остальные - для вашего отличного ввода
Если кто-то сочтет нужным закрыть этот вопрос (как не ожидая дальнейших ожиданий), он/она должен быть свободен делать это - я не могу это решить, поскольку я не являюсь гуру.