C言語では、ブロック暗号の暗号化ルーチンと復号化ルーチンの両方を実装する関数があります。双方の共通の命名と利用規約を維持するために、後に2つの異なる機能へのルーチンを分離する可能性を開いたままにするために、私は次のようやった:そのI」を除いて、正常に動作しますC:静的関数を隠すパブリックエイリアス
void cipher(char *out, const char *in);
#define encrypt cipher
#define decrypt cipher
実際の関数(cipher
)を隠すのが大好きなので、人々はencrypt
またはdecrypt
を使用しなければなりません。今、cipher
はパブリックインターフェイスの一部なので、後で2つの異なる関数に分割してcipher
を削除することにした場合、厳密に言えば、私はインターフェイスを破棄しています。しかし、もし私がcipher
を隠すことができるのであれば、encrypt
とdecrypt
だけがインターフェイスの一部です。私は(
私がこれまでに作ってみた唯一のオプションは、cipher
は、静的行い、cipher
を呼び出すためにencrypt
decrypt
の実際の機能を実装しているが、私は追加のオーバーヘッドが実際に価値があることはよく分かりませんできるだけタイトなコードサイズを維持しようとすると、この同じ問題が複数発生します)。
私は関数ポインタでできることはありますか?他のアイデア?
どのようにstaticとしてヘッダファイルに 'encrypt'と' decrypt'の定義について'cipher'を呼び出すインライン関数?これはあなたにソースの互換性を与えるでしょう( 'cipher'がシンボルテーブルにあるからといってそれがAPIにあるわけではないからです)、後で' cipher'をdllから取り除くとバイナリ互換性はありません。 –
ああ、btw、何もしないラッパー関数を呼び出すと、測定可能なオーバーヘッドが生成された場合、ブロック暗号は弱くなります;-p –
@Steve:うーん、それはうまくいくが、警告( "暗黙の関数宣言"暗号 '')。その場合、誰かが 'cipher'を直接呼び出すことができます。ヘッダーファイルにはありません。だから私はそれが問題になっていると思いますが、それは私には悪いことです。これを防ぐために 'cipher'を' static'とマークするとリンクされません。 – brianmearns