我寫的C庫,我不知道該怎麼做了一些功能的用戶(這是用來實現的功能)不可見。 C有什麼辦法?我的第二個問題是:當我包括的.h或.c文件的一些庫(讓我們看看math.h中)沒有任何問題,當用戶在宣佈他的計劃相同的標題(使用我當然庫)?C庫包括
又有怎樣的結構?有沒有關鍵詞?
我寫的C庫,我不知道該怎麼做了一些功能的用戶(這是用來實現的功能)不可見。 C有什麼辦法?我的第二個問題是:當我包括的.h或.c文件的一些庫(讓我們看看math.h中)沒有任何問題,當用戶在宣佈他的計劃相同的標題(使用我當然庫)?C庫包括
又有怎樣的結構?有沒有關鍵詞?
如何使某些功能看不見?
實施例定義的功能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;
}
通常的方式是使執行的功能的靜態即與存儲符static
聲明它們並把它們與代碼模塊。所以這兩個頭文件都不會引用這些函數。
您可以使用關鍵字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
(這是本示例lib的相關API函數),而忽略符號表中的所有其他符號。
1.請解釋爲什麼用戶會看到這些功能,只提供一個只包含您想要導出功能的標題。 2.使用MSVC,你必須明確地導出你想要的符號,而gcc也有一個可見性選項。不,您可以多次包含標題,只要它包含警衛。標準庫標題具有它們。 –
我的意思是我有一些函數:函數func使用的tmp1,tmp2,tmp3。我希望只有func纔會像標準庫一樣被用戶看到。所以include和程序員只能使用func,而不是tmp1,tmp2,tmp3 – Edison91
你聲明它們是'static',它們將有文件範圍(*這是一種非常常見的技術*)。但是,如果您不發佈代碼以及爲什麼您遇到問題,則無法爲您提供幫助。 –