我有一個 「頭文件」(file1.h),它具有多個函數原型聲明和一個具有相關函數定義的「C文件」(file1.c)。僅從頭部暴露一小部分函數
我想暴露只有特定的函數原型從「頭文件」(file1.h)到另一個「C文件」(file2.c)而不暴露其餘的功能。
問題1:最好的方法是什麼? 選項:創建了另一個只包含在(file2.c)中的功能的頭文件
問題2 & 3:何時extern
派上用場? 我在頭文件的某些函數中看到了extern
的用法,而其他函數不使用該關鍵字。這個主意是什麼?
我有一個 「頭文件」(file1.h),它具有多個函數原型聲明和一個具有相關函數定義的「C文件」(file1.c)。僅從頭部暴露一小部分函數
我想暴露只有特定的函數原型從「頭文件」(file1.h)到另一個「C文件」(file2.c)而不暴露其餘的功能。
問題1:最好的方法是什麼? 選項:創建了另一個只包含在(file2.c)中的功能的頭文件
問題2 & 3:何時extern
派上用場? 我在頭文件的某些函數中看到了extern
的用法,而其他函數不使用該關鍵字。這個主意是什麼?
簡單。對於「公共」函數原型/聲明,將它們放在.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,您的「私人」符號也只能通過非便攜式黑客直接訪問。
享受!
在公共API中公開一些函數的一種常見方式(這是Motif GUI庫如何執行它)是將公共可用函數的原型放在MyThing.h中,然後將其餘的放在MyThingI.h中,其中#包括MyThing.h,而你的.c文件包含MyThingI.h(我是用於內部的)。這樣,您自己的代碼可以包含多個包含I.h文件的文件,而與您的庫一起交付的公共.h文件僅包含.h文件。
.h文件中的所有原型都應該使用「extern」關鍵字。
請告訴我爲什麼它會成爲一個問題所有原型沒有暴露 –
簡短的建議:不要。在鏈接時,函數**將被**曝光*無論如何。因此:您可以從編譯器中隱藏標題中的名稱,但不能從鏈接器隱藏目標文件中的名稱。 – wildplasser
@Ed Heal我不希望第二個文件(file2.c)能夠訪問(file1.c)中的其他函數。一般來說,我不知道爲什麼通過在項目中包含所有C文件來公開項目中的所有頭文件會影響我的代碼。 – newb7777