2016-01-24 2 views
0

Я пишу библиотеку C, и я не знаю, как сделать некоторые функции невидимыми для пользователя (которые используются для реализации функциональности). Есть какой-то способ в C? И мой второй вопрос: когда я включаю некоторую библиотеку в файл .h или .c (давайте посмотрим math.h) есть ли проблемы, когда пользователь объявляет тот же заголовок в своей программе (которые, конечно, используют мою библиотеку)?C библиотека включает

А как насчет структуры? Есть ли ключевое слово?

+1

1. Пожалуйста, объясните, почему пользователь увидит функции, предоставит заголовок только с функциями, которые вы хотите экспортировать. 2. С MSVC вы должны явно экспортировать нужные символы, а gcc также имеет параметр видимости. 3. Нет, вы можете включать заголовок несколько раз при условии, что он содержит защитные устройства. У них есть стандартные заголовки библиотек. –

+0

Я имею в виду, что у меня есть некоторая функция: tmp1, tmp2, tmp3, которые используются функцией func. И я хочу, чтобы только func был видимым пользователем, как в стандартной библиотеке. Поэтому include и программист могут использовать только func, а не tmp1, tmp2, tmp3 – Edison91

+4

Вы объявляете их 'static', и у них будет область файлов (* это очень распространенная техника *). Но если вы не публикуете код и почему у вас проблемы, вам это не поможет. –

ответ

0

Как сделать некоторые функции невидимыми?

  1. не объявить функцию в файле заголовка вашей библиотеки
  2. определяют функцию static в исходном файле вашей библиотеки

Пример:

СВОИМИ lib.h

#ifndef YOUR_LIB_H 
#define YOUR_LIB_H 

void do_public_stuff(void); 

#endif YOUR_LIB_H 

ваш-lib.c

#include "your-lib.h" 

// this functions is invisible 
static void do_private_stuff(void) 
{ 
    // ... 
} 

// this functions is visible 
void do_public_stuff(void) 
{ 
    // ... 
} 

пользователя code.c

#include "your-lib.h" 

int main(void) 
{ 
    do_public_stuff(); 
    return 0; 
} 
+0

Большое спасибо! Это ответ на мой вопрос – Edison91

+0

@ Edison91 Добро пожаловать. – sergej

0

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

0

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

Простой пример:

Ваша библиотека имеет 3 объекта: lib1.o lib2.o util.o

Расположенный в util.o несколько хелперов-функции, которые используются lib1.o и lib2.o. Вы не можете использовать static здесь, потому что функции не будут видны для них, и связь не сработает.

Что вы можете сделать:

Сделать хелперы-функции нестатическая и обеспечивают линкер с версии сценария в, которая только экспортирует необходимые символы:

gcc -shared lib1.o lib2.o util.o -o mylib.so -Wl,--version-script=map 

Файл map может иметь следующее содержание:

{ 
    global: 
     bar; 
     baz; 
    local: *; 
}; 

Это будет экспортировать только символы bar и baz (которые являются соответствующими API-функциями для этого примера lib), но при этом опуская все остальные символы из таблицы символов.

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