2016-04-14 8 views
1

ハードウェア固有の静的ライブラリでコンパイルするベンダー固有のOpenGLヘッダをコンパイルしましたが、nVidia Quadro 4000カードとライブラリlinux)。これは私たちのベンダーがホスト環境でやるべきだと言っているので、心配する必要はありません。動的リンクライブラリ(dll/so)のchar *タイプの関数パラメータ

私は何か奇妙なものが見つかりました。ベンダー固有のヘッダーにはGLcharが 'unsigned char'(sigh ...)とタイプされていましたが、nVidiaヘッダーはそれを 'char'とタイプしました。これらのタイプは同じではありませんが、それはまだ「動作します」。私は暗黙のうちにchar *をunsigned char *にキャストすることはできません。それは私にコンパイルエラーを与えますが、おそらく 'char'プロトタイプを使って構築された関数(glGetUniformLocation)ライブラリをリンクして正常に実行できます。

どうしましたか?ランタイムは 'char'が 'unsigned char'に "close-enough"であると判断して解決しましたか?あるいは、図書館を建てるときに、「char」の出現が一つの署名に拡張されているのか、それとも他のものに拡張されているのでしょうもしそうなら、3種類の署名のすべてを関数にオーバーロードするとどうなりますか?

編集:OpenGLライブラリはC-linkageを使用していることに注意してください。

答えて

3

Cリンケージを使用すると、関数はリテラル名でリンクされます。名前のマングリングを持つC++とは異なり、何も引数の型を制御しません。あなたのプログラムが関数を呼び出すときには、引数をスタックまたはレジスタに(呼び出し規約に従って)置き、関数がそれを読み込みます。ポインタは(4または8バイト)置かれ、ポインタは(同じサイズの)読み込まれます。呼び出し元はポインタをunsigned char*と解釈し、呼び出し先はchar*と解釈します。

呼び出し元が呼び出し元よりも多少バイトを読み取ると、スタックが壊れて、奇妙な望ましくない動作につながります。

呼び出し元がfloatを呼び出した後に呼び出されるとintが返された場合、呼び出し先は分かりやすいデータではなく、ガベージを処理します。

+0

右。私はOpenGLライブラリがCリンケージを使用していることを忘れていました。 – Andreas

+0

@Andreasああ、それはあなたが何が起こっているのか理解して良いです。私はすでに、おそらくあなたにとって明白ないくつかのノートを追加しました。 –

関連する問題