在C中,我有一个实现分组密码的加密和解密例程的函数.为了保持一个共同的命名和使用约定,并留下将例程分成两个不同函数的可能性,我已经完成了以下工作:
void cipher(char *out, const char *in);
#define encrypt cipher
#define decrypt cipher
这很好,除了我真的想隐藏实际的功能(密码),所以人们必须使用加密或解密.现在,密码是公共接口的一部分,所以如果我决定稍后将它分成两个不同的函数并删除密码,严格来说,我打破了界面.但是,如果我可以隐藏密码所以只有加密和解密是接口的一部分,我会没事的.
到目前为止我唯一提出的选择是make cipher static,并实现加密解密的实际函数来调用密码,但我不确定增加的开销实际上是值得的(我试图保持代码大小尽可能紧,我有多次出现同样的问题).
我可以用函数指针做些什么吗?还有其他想法吗?
最佳答案 你可以使用函数指针:
static void cipher(...);
void (*encrypt)(...) = cipher;
void (*decrypt)(...) = cipher;
至少在典型的使用中(用户只使用加密(无论如何);)这通常是不可见的.唯一明显的问题是,如上所述,指针仍然是可写的,因此您可能希望将它们设为const,这样用户就不会意外地用其他函数的地址覆盖它们.
另一种可能性是使用名称密码是公共的(或将其重命名为private_cipher_以避免意外名称冲突),然后只使用几个宏:
#define encrypt(x, y) private_cipher_((x), (y))
#define decrypt(x, y) private_cipher_((x), (y))
这应该确保不会产生任何开销.