2012-04-11 13 views
2

バージョン1とバージョン2の間でパラメータを追加した外部ライブラリの関数を呼び出します。両方のバージョンをサポートしたいと思います。コンパイル時にextern関数呼び出しのシグネチャを選択/検出

私はバージョン2では

extern void run(int param1); 

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

を行う。この時点で、それが実行されます(int型のparam1、int型PARAM2)。

何らかの理由で動的にリンクしているライブラリのバージョンを検出できますか? (パラメータの数)

私は、ユーザにMakefileでライブラリバージョンを設定させ、プリプロセッサ-ifsでこれを解決させないようにしたいと思います。

+0

どのライブラリですか?図書館の開発者が前向きに考えていたなら、図書館のユーザーが図書館の版を入手する方法があります。関数またはグローバル変数である可能性があります。このようなバージョンの可読性がないと、ライブラリAPIの呼び出しシグネチャを変更すること自体が邪魔になります。 – TJD

+0

残念ながらそれは利用できません。 makeを実行すると、ライブラリディレクトリのREADMEからgrep/grepを取得することができます。 – j13r

答えて

0

Cコードの仕組みは、v1関数が最初に渡されたパラメータにのみアクセスできることです。そのパラメータが両方のバージョンと同じ意味を持つ限り、どちらの関数にも両方のパラメータを渡すことができます。 v1は最初のものだけを表示します。 v2に両方のパラメータが表示されます。

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

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

+0

この関数がヘッダーで宣言されていると仮定すると、コンパイラーはこのコードを受け入れません。たとえ(または宣言されていなくても)標準の何もそれが動作することを保証するものはありません。 (コンパイラは、多様な関数に対して異なる呼び出し変換を実装するかもしれない) – asaelr

関連する問題