[討論] 撰寫runtime時減少重複命名的可能

作者: sunneo (艾斯寇德)   2014-08-03 06:17:57
前陣子寫一些玩具,這些玩具會給其他人使用,但不免地其他人會link其他library,
或者include更多的工具,結果有時會發生命名重複而導致重複定義的窘境,
尤其是在C,沒有namespace可以用。
在C上,不讓其他檔案看到的方法是用static。
那如果有跨檔案的需求,又不希望使用者直接用到這些符號呢?
我通常會使用很長的名字,或者用函式表。(以下1,2用過)
0. 通通不管,寫成外部函式,用LoadLibrary或dlopen來叫用自己的東西 -_-#
1. 很長的名字
__somepack_subname_structName_method
2. 一個統一的函式表,放一大堆的函式指標
struct FunctionTable{
void (*somefnc1)();
void (*somefnc2)();
};
宣告一個很誇張的名字
用統一的標頭檔以define把誇張的名字define為簡易的名字
3. 統一入口,像syscall那樣
void __somepack_subname_libcall(void* argv[]);
他接收一個void*陣列,叫用時依照格式 {函式id, 參數},後端從函式id從函式指標陣列
取出函式,直接將void*陣列傳給函式。而函式製作時已經先考慮從void* 接收起。
後端runtime之間共用一個header,header可能
3-1 用巨集來export這些symbol給內部用,描述caller
#define EnumConsoleOut 1
#define CONSOLE_OUT(STRING) \
do { \
void* argv[]={ \
(void*)EnumConsoleOut; \
(STRING), \
}; \
__somepack_subname_libcall(argv);\
} while(0)
3-2 用static函式在header製作一份caller,各檔案之間各自一份
static void consoleOut(const char* str){
void* argv[]={(void*)EnumConsoleOut,str};
__somepack_subname_libcall(argv);
}
作者: bluesoul (忙死你老爸)   2014-08-03 11:42:00
請問一下,為何要用do while(0)呢?
作者: CCWck (幹嘛要暱稱)   2014-08-03 11:52:00
do while(0)配合break可以做類似goto的做法 跳到後面去
作者: carylorrk (carylorrk)   2014-08-03 12:46:00
爲了用起來像是 function?(加分號纔會過)
作者: scwg ( )   2014-08-03 23:40:00
ld --version-script 應該是最正統的做法
作者: sunneo (艾斯寇德)   2014-08-04 02:57:00
原來如此。感謝樓上,我也是想詢問各種處理方法
作者: Bencrie   2014-08-06 09:41:00
用 __attribute__((visibility ("hidden"))) ?
作者: scwg ( )   2014-08-06 11:07:00
同意 Bencrie

Links booklink

Contact Us: admin [ a t ] ucptt.com