2

バージョン 1 とバージョン 2 の間にパラメーターを追加した外部ライブラリーの関数を呼び出しています。両方のバージョンをサポートしたいと考えています。

この時点で私は

 extern void run(int param1); 

 ... in the code ...
 run(123);

バージョン 2 では run(int param1, int param2) です。

リンク先のライブラリのバージョンを何らかの方法で動的に検出できますか? (パラメータ数)

ユーザーが Makefile でライブラリのバージョンを設定し、これを preprocessor-ifs で解決する必要がないようにしたいと思います。

4

1 に答える 1

0

Cコードが機能する方法は、v1関数が最初に渡されたパラメーターにのみアクセスできることです。そのパラメーターが両方のバージョンで同じ意味を持っている限り、提供されている関数に両方のパラメーターを安全に渡すことができます。v1は最初のものだけを表示します。v2には両方のパラメーターが表示されます。

この力は、などの可変数の引数をサポートするCのアーキテクチャ上の必要性に由来しますprintf()。呼び出しコードは、呼び出しの完了後にパラメーターを削除し、パラメーターは右から左にプッシュされるため、最初の(左端の)パラメーターは常にスタックフレームの一番上にあります。

ライブラリのAPIがアップグレードのためにひどく冒涜された場合にのみ、最初のパラメーターは異なる意味を持ちます。

于 2012-04-11T23:16:04.283 に答える