2016-01-24 98 views
0

我寫的C庫,我不知道該怎麼做了一些功能的用戶(這是用來實現的功能)不可見。 C有什麼辦法?我的第二個問題是:當我包括的.h或.c文件的一些庫(讓我們看看math.h中)沒有任何問題,當用戶在宣佈他的計劃相同的標題(使用我當然庫)?C庫包括

又有怎樣的結構?有沒有關鍵詞?

+1

1.請解釋爲什麼用戶會看到這些功能,只提供一個只包含您想要導出功能的標題。 2.使用MSVC,你必須明確地導出你想要的符號,而gcc也有一個可見性選項。不,您可以多次包含標題,只要它包含警衛。標準庫標題具有它們。 –

+0

我的意思是我有一些函數:函數func使用的tmp1,tmp2,tmp3。我希望只有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.olib2.o使用。你不能在這裏使用static,因爲這些函數對他們來說是不可見的,並且鏈接會失敗。

你可以做什麼:

做輔助函數非靜態的,並提供了版本腳本,其中僅出口所需的符號鏈接:

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

文件map可能有以下內容:

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

這隻會導出符號barbaz(這是本示例lib的相關API函數),而忽略符號表中的所有其他符號。