Предположим, вы пишете библиотеку, и у вас есть куча полезных функций, которые вы написали только для себя. Разумеется, вы не хотите, чтобы эти функции имели внешнюю связь, чтобы пользователи не были замешаны пользователями вашей библиотеки (главным образом потому, что вы не собираетесь рассказывать об окружающем мире их существования)Как вы можете совместно использовать внутренний набор функций между единицами перевода без их внешней связи?
С другой стороны эти функции могут использоваться в разных единицах перевода, поэтому вы хотите, чтобы они были совместно использованы.
Приведем пример. У вас есть библиотека, которая делает некоторые вещи и в разных исходных файлах, вам может понадобиться copy_file
и create_directory
, чтобы вы реализовали их как служебные функции.
Чтобы убедиться, что пользователь вашей библиотеки случайно не получить ошибку сцепления из-за наличие функции с тем же именем, что я могу думать о следующих решениях:
- страшному: Копировать вставить функции для каждого файла, который их использует, добавив
static
к их объявлению. - Не очень хороший способ: Напишите их как макросы. Мне нравятся макросы, но это просто не так.
- Дайте им такое странное имя, что шансы пользователя с тем же именем будут достаточно малы. Это может сработать, но делает код очень уродливым.
- Что я делаю сейчас: Напишите их как
static
функции во внутреннем файлеutils.h
и включите этот файл в исходные файлы.
Теперь последний вариант работает почти нормально, за исключением того, что он имеет одну проблему: если вы не используете одну из функций, по крайней мере, вы получаете предупреждение об этом (это говорит о том, что функция объявлена статической, но никогда не используется). Назовите меня сумасшедшим, но я оставляю код без предупреждения.
Что я прибегал сделать что-то вроде этого:
utils.h:
...
#ifdef USE_COPY_FILE
static int copy_file(/* args */)
{...}
#endif
#ifdef USE_CREATE_DIR
static int create_dir(/* args */)
{...}
#endif
...
file1.c:
#define USE_COPY_FILE
#define USE_CREATE_DIR
#include "utils.h"
/* use both functions */
file2.c
#define USE_COPY_FILE
#include "utils.h
/* use only copy_file */
Проблема с этим методом, однако, я что он начинает становиться уродливым, поскольку вводятся больше утилит. Представьте, что если у вас есть 10 таких функций, вам нужно иметь 7 ~ 8 строк определения до включения, если вам нужно 7 ~ 8 из этих функций!
Конечно, другим способом было бы использовать тип макросов DONT_USE_*
, которые исключают функции, но затем вам нужно много определений для файла, который использует несколько из этих служебных функций.
В любом случае, он не выглядит элегантным.
Вопрос в том, как у вас есть функции, которые являются внутренними в вашей собственной библиотеке, используемые несколькими единицами перевода и избегают внешних связей?
С инструментальной связкой GNU, по крайней мере, вы можете пометить символы как «местные». –
@OliCharlesworth Я использую 'gcc'. Постарайтесь объяснить, как это сделать? (Желательно в ответе) – Shahbaz
Я уже собирался, но потом заметил, что это дубликат: [Ограничение символов в статической библиотеке Linux] (http://stackoverflow.com/questions/393980/restricting-symbols-in-a-linux -static-library) –