[英]C: Public aliases to hide a static function
在C語言中,我有一個函數可以實現分組密碼的加密和解密例程。 為了保持通用的命名和使用約定,並為以后保留將例程分為兩個不同的功能的可能性,我做了以下工作:
void cipher(char *out, const char *in);
#define encrypt cipher
#define decrypt cipher
這樣做很好,除了我真的想隱藏實際的函數( cipher
),所以人們必須使用encrypt
或decrypt
。 現在, cipher
是公共接口的一部分,因此,如果我決定稍后將其分為兩個不同的功能並刪除cipher
,嚴格來說,我正在破壞該接口。 但是,如果我可以隱藏cipher
以便僅encrypt
和decrypt
是接口的一部分,那么我會好的。
到目前為止,我想出的唯一選擇是使cipher
靜態,並實現用於encrypt
decrypt
以調用cipher
實際功能,但是我不確定增加的開銷實際上是否值得(我試圖保持代碼大小越小越好,並且我多次出現相同的問題)。
我可以使用函數指針做什么? 還有其他想法嗎?
您可以使用函數指針:
static void cipher(...);
void (*encrypt)(...) = cipher;
void (*decrypt)(...) = cipher;
至少在通常的使用中(用戶只是使用encrypt(whatever);
),這通常是不可見的。 唯一明顯的問題是,如上所定義,指針保持可寫狀態,因此您可能希望將它們設置為const
以便用戶不會意外地用其他函數的地址覆蓋它們。
另一種可能是使用cipher
公用名稱(或將其重命名為private_cipher_
以避免類似的名稱沖突),然后僅使用幾個宏:
#define encrypt(x, y) private_cipher_((x), (y))
#define decrypt(x, y) private_cipher_((x), (y))
這應該確保不會產生任何開銷。
如果使用的是GCC,則可以使用alias
屬性來創建兩個指向cipher
功能的別名。
但是請記住Steve Jessop的評論,並考慮只編寫兩個包裝函數。 它不會引起明顯的開銷。 編譯器甚至可能將這些包裝器功能作為一條跳轉指令編寫。
在GCC(和兼容)平台中,您還可以使用fluff屬性來控制符號可見性,版本控制和別名:
static void xxx_encrypt_decrypt(char *y, const char *x) { ... }
void encrypt(char *, const char *) __attribute__((alias("xxx_encrypt_decrypt")));
void decrypt(char *, const char *) __attribute__((alias("xxx_encrypt_decrypt")));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.