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

看板C_and_CPP作者 (艾斯寇德)時間9年前 (2014/08/03 06:18), 9年前編輯推噓1(107)
留言8則, 7人參與, 最新討論串1/1
前陣子寫一些玩具,這些玩具會給其他人使用,但不免地其他人會link其他library, 或者include更多的工具,結果有時會發生命名重複而導致重複定義的窘境, 尤其是在C,沒有namespace可以用。 在C上,不讓其他檔案看到的方法是用static。 那如果有跨檔案的需求,又不希望使用者直接用到這些符號呢? 我通常會使用很長的名字,或者用函式表。(以下1,2用過) 0. 通通不管,寫成外部函式,用LoadLibrarydlopen來叫用自己的東西 -_-# 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); } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.1.247 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1407017881.A.DCF.html

08/03 11:42, , 1F
請問一下,為何要用do while(0)呢?
08/03 11:42, 1F

08/03 11:52, , 2F
do while(0)配合break可以做類似goto的做法 跳到後面去
08/03 11:52, 2F

08/03 11:56, , 3F
Google "define do while 0" 就有一堆解釋了
08/03 11:56, 3F

08/03 12:46, , 4F
爲了用起來像是 function?(加分號纔會過)
08/03 12:46, 4F
※ 編輯: sunneo (220.132.1.247), 08/03/2014 16:58:38

08/03 23:40, , 5F
ld --version-script 應該是最正統的做法
08/03 23:40, 5F

08/04 02:57, , 6F
原來如此。感謝樓上,我也是想詢問各種處理方法
08/04 02:57, 6F

08/06 09:41, , 7F
用 __attribute__((visibility ("hidden"))) ?
08/06 09:41, 7F

08/06 11:07, , 8F
同意 Bencrie
08/06 11:07, 8F
文章代碼(AID): #1JtMEPtF (C_and_CPP)