[讨论] 撰写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