使用來自那些不同的定義假設你正在編寫內部使用的某些數據結構,並希望出口到用戶只是其中的一個子集的庫(或使用類似void *
隱藏的確切類型)。庫中使用的所有結構和函數的定義位於標題library.h
中,這將在構建庫時使用。使用外部頭文件與內部
是否也生成library.h
的另一個副本,這種副本在構建過程中不會被使用,但只有鏈接到庫的用戶才被使用?
例如,假設庫的內部使用以下library.h
:
#ifndef LIBRARY_H
#define LIBRARY_H
struct myStruct {
int some_x;
void (*some_callback)(void);
};
typedef struct myStruct *myStruct_t;
#endif
雖然我們想隱藏的myStruct
給用戶的定義,所以我們出口頭library.h
是:
#ifndef LIBRARY_H
#define LIBRARY_H
typedef void *myStruct_t;
#endif
你應該考慮'library.h'和'library_impl.h'(或類似),與後者#包括前者。 –
我傾向於組織我的項目,以便* public *標頭位於'include'子樹中,而* private *標頭(如@OliverCharlesworth'建議'* _impl.h')與源文件並排放置。然後安裝只安裝公共的。 –
其他建議:如果你有*私有函數*以及在你的庫的翻譯單元中調用,但不打算通過使用代碼調用,谷歌爲符號可見性 - 例如gcc具有'__attribute __((visibility( 「hidden」)))' –