簡體   English   中英

C:公共別名以隱藏靜態函數

[英]C: Public aliases to hide a static function

在C語言中,我有一個函數可以實現分組密碼的加密和解密例程。 為了保持通用的命名和使用約定,並為以后保留將例程分為兩個不同的功能的可能性,我做了以下工作:

void cipher(char *out, const char *in);
#define encrypt    cipher
#define decrypt    cipher

這樣做很好,除了我真的想隱藏實際的函數( cipher ),所以人們必須使用encryptdecrypt 現在, cipher是公共接口的一部分,因此,如果我決定稍后將其分為兩個不同的功能並刪除cipher ,嚴格來說,我正在破壞該接口。 但是,如果我可以隱藏cipher以便僅encryptdecrypt是接口的一部分,那么我會好的。

到目前為止,我想出的唯一選擇是使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM