2017-03-01 45 views
-1

我有一個 「頭文件」(file1.h),它具有多個函數原型聲明和一個具有相關函數定義的「C文件」(file1.c)。僅從頭部暴露一小部分函數

我想暴露只有特定的函數原型從「頭文件」(file1.h)到另一個「C文件」(file2.c)而不暴露其餘的功能。

問題1:最好的方法是什麼? 選項:創建了另一個只包含在(file2.c)中的功能的頭文件

問題2 & 3:何時extern派上用場? 我在頭文件的某些函數中看到了extern的用法,而其他函數不使用該關鍵字。這個主意是什麼?

+0

請告訴我爲什麼它會成爲一個問題所有原型沒有暴露 –

+2

簡短的建議:不要。在鏈接時,函數**將被**曝光*無論如何。因此:您可以從編譯器中隱藏標題中的名稱,但不能從鏈接器隱藏目標文件中的名稱。 – wildplasser

+0

@Ed Heal我不希望第二個文件(file2.c)能夠訪問(file1.c)中的其他函數。一般來說,我不知道爲什麼通過在項目中包含所有C文件來公開項目中的所有頭文件會影響我的代碼。 – newb7777

回答

2

簡單。對於「公共」函數原型/聲明,將它們放在.h文件中。

func.h


int func1(void); 
int func2(int i); 

對於你不想暴露的功能,只是把它們放在.c文件。

func.c


/* Function prototypes. */ 
static int func3(void); 

/* Function definitions. */ 
int func1(void) { 
    func3(); 
    return 0; 
} 

int func2(int i) { 
    func3(); 
    return (i + i); 
} 

static int func3(void) { 
    return 42; 
} 

下一頁,這取決於你的編譯器,安裝一個exported symbol whitelist(即:gcc hidden attributes,例如,在Linux上),以限制符號的導出什麼。

最後,strip它已被編譯後的最終二進制文件(即:strip --strip-unneeded myfile.so),並且您已全部設置。即使用戶知道正在使用的API,您的「私人」符號也只能通過非便攜式黑客直接訪問。

享受!

0

在公共API中公開一些函數的一種常見方式(這是Motif GUI庫如何執行它)是將公共可用函數的原型放在MyThing.h中,然後將其餘的放在MyThingI.h中,其中#包括MyThing.h,而你的.c文件包含MyThingI.h(我是用於內部的)。這樣,您自己的代碼可以包含多個包含I.h文件的文件,而與您的庫一起交付的公共.h文件僅包含.h文件。

.h文件中的所有原型都應該使用「extern」關鍵字。