問題タブ [calling-convention]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 関数ポインタと呼び出し規約
呼び出し規約で関数ポインタを宣言する方法は? 上記は私にエラーを与えます。
c++ - 関数へのポインタ型の呼び出し規約を確認してください
関数ポインタに__stdcall
呼び出し規約があることをコンパイル時に確認する方法は?
何かのようなもの
または少なくとも
c# - __c#内のfastcall規則
それを考慮して:
Microsoft固有
__fastcall呼び出し規約は、可能な場合、関数への引数がレジスターで渡されることを指定します。次のリストは、この呼び出し規約の実装を示しています。
また、レジスタの読み取り/書き込み時間はスタックよりもはるかに高速ですが、C#に同等の__fastcallはありますか?
c - 構造体を返す関数の呼び出し規約
次のCコードの場合:
Win32の場合、次のように分解されます。
Linux32の場合:
呼び出し後の発信者の動作の違いを理解しようとしています。Linux32の呼び出し元がこれらの追加の潜水艦を行うのはなぜですか?
私は、両方のターゲットがcdecl呼び出し規約に従うと想定します。cdeclは、構造体を返す関数の呼び出し規約を定義していませんか?!
編集:
呼び出し先の実装を追加しました。そして確かに、Linux32の呼び出し先は引数をポップしますが、Win32の呼び出し先はそうではないことがわかります。
Win32の分解:
Linux32の分解:
c++ - 「cdecl」は何の略ですか?
はい、「cdecl」が有名な呼び出し規約の名前であることは知っています。そのため、呼び出し規約について説明しないでください。私が求めているのは、略語 (?) "cdecl" が実際に何を表しているかです。一見すると「C宣言子」(Cのかなりユニークな構文的側面)の1つを連想させるため、これは不適切な命名の選択だと思います。実際、 cdeclというプログラムがあり、その唯一の目的は C 宣言子を解読することです。しかし、C 宣言子の構文は、私が知る限り、呼び出し規約とはまったく関係がありません。
簡略版: 「stdcall」は「標準呼び出し規約」を表します。「cdecl」は何の略ですか?
c# - 値による呼び出しと値による受け渡しは同義ですか?
私はいつも、値による呼び出しと値による受け渡しは同義語だと思っていました。しかし、最近、誰かが彼らを違うように呼んでいるのを聞いた。それらは同じものですか?
また、対応する参照による用語についても話します。
.net - (.NET 3.5 で) 呼び出し規則に違反した場合に PInvoke がクラッシュしないのはなぜですか?
私のソリューションには、関数をエクスポートするアンマネージド C++ DLL と、この関数を PInvoke するマネージド アプリケーションがあります。
ソリューションを .NET 3.5 から .NET 4.0 に変換したところ、この PInvokeStackImbalance "A call to PInvoke function [...] has unbalanced the stack"例外が発生しました。結局のところ、__stdcall だったので、__cdecl された関数を呼び出していました。
C++ 部分 (呼び出し先):
C# 部分 (呼び出し元):
それで、私はバグを修正しましたが、これが .NET 3.5 でどのように機能したのかに興味がありますか? (何度も繰り返される) 誰も (呼び出し先も呼び出し元も) スタックをクリーンアップせず、スタック オーバーフローやその他の不正行為を引き起こさず、正常に機能したのはなぜですか? Raymond Chen の記事で言及されているように、PInvoke には何らかのチェックがありますか? また興味深いのは、反対のタイプの規約違反 (__stdcall 呼び出し先を __cdecl のように PInvoked にする) がまったく機能せず、単に EntryPointNotFoundException が発生する理由です。
c# - C# デリゲートの呼び出し規約を CDECL に変更する
DotNet1.1を使用していたときにC#でこの問題が発生しました
問題はこれです。私は管理されていない dll を持っています。これには、(他の引数の中でも) 関数ポインターを受け取る関数があります。C# コードで DLLImport を宣言するときに、デリゲートを渡します。ただし、C# のデリゲートにはstdcall
呼び出し規約がありますが、アンマネージ関数にはcdecl
関数ポインターが必要です。したがって、私の素朴なアプローチはクラッシュを引き起こしました。http://www.codeproject.com/KB/cs/cdeclcallback.aspxある人が、私が理解しているように、MSIL ハッキングによってデリゲートの呼び出し規約を変更できる優れたライブラリを作成しました。物事はうまくいった、まで...
VS2008 と新しいバージョンの .NET に移行しました。このバージョンでは、上記のライブラリは動作しません。私は実際には C# や .NET の専門家ではありません。実を言うと、彼のライブラリが何をするものなのかほとんど理解していません (オープン ソースではありますが)。ただし、C# の新しいバージョンには、私の問題に対するより良い解決策があることを願っています。
だから、SOの専門家、お尻の痛みを手伝ってください:)
assembly - vararg関数はどのようにしてマシンコードの引数の数を見つけますか?
printfのような可変個引数関数は、取得した引数の数をどのように見つけることができますか?
引数の量は明らかに(非表示の)パラメーターとして渡されません(ここのasmの例でprintfの呼び出しを参照してください)。
トリックは何ですか?
c++ - C++:ベクトル構造体を参照または値で渡しますか?
これは私のベクトル構造体です:struct Vector{ float x, y; };
- 値またはとして関数に渡す必要があります
const Vector&
か?