問題タブ [cdecl]

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.

0 投票する
10 に答える
7744 参照

c - C の宣言をどのように読みますか?

いくつかの方法について聞いたことがありますが、どれも行き詰まっていません。個人的には、C で複雑な型を避け、コンポーネントの typedef に分割しようとしています。

私は今、いわゆる「三ツ星プログラマー」のレガシー コードを保守することに直面しており、***コード[][]のいくつかを読むのに苦労しています。

複雑な C 宣言をどのように読みますか?

0 投票する
5 に答える
2486 参照

c++ - C++ では、可変個引数関数 (パラメーター リストの最後に ... があるもの) は、必ず __cdecl 呼び出し規約に従いますか?

__stdcall 関数に省略記号を使用できないことはわかっていますが、__cdecl または __stdcall 以外の規則を呼び出すための stdarg.h 関数をサポートするプラットフォームがないことを確認したいと思います。

0 投票する
3 に答える
2199 参照

visual-studio-2010 - __cdecl 呼び出し規約を使用して boost をコンパイルするにはどうすればよいですか?

__cdecl呼び出し規約 (msvc2010) を使用してコンパイルされたプロジェクトがあり、デフォルト設定を使用して同じコンパイラを使用してブーストをコンパイルしました。

プロジェクトはブーストにリンクされていましたが、実行時に次のようなアサート メッセージが表示されました: ファイル: ...\boost\boost\program_options\detail\parsers.hpp 行: 79

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

次の質問があります。

  • Windows (msvc2010) でデフォルトでビルドをブーストする呼び出し規約
  • __cdecl 呼び出し規約でブーストをコンパイルする方法
  • なぜブーストは異なる呼び出し規約を持つコードとのリンクを防ぐことができなかったのですか? ブーストには本当にスマートなライブラリ自動インクルージョン コードがあることを理解しました。

更新 #1

ブーストは適切な呼び出し規約でコンパイルおよびリンクしているように見えますが、実行時に上記の問題が発生します。同じコードを使用してサンプル アプリケーションを実行しましたが、動作しますが、私のアプリケーションでは失敗します。唯一の違いは、プロジェクト構成または includes/stdafx.h によるものです。

0 投票する
2 に答える
1180 参照

c++ - 呼び出し規約が混在しているとコンパイル エラーが発生する

いくつかの API 関数を持つライブラリ (C++) があります。そのうちの 1 つは __cdecl として宣言されていますが、__stdcall から関数ポインターを取得します。何かのようなもの:

次に、このライブラリを使用する C++ 実行可能プロジェクトがありますが、上記の API を呼び出さないか、Func型を使用しません。

の呼び出し規約を に変更した後Func__stdcall次のコンパイル エラーが発生します。

エラー C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))': 関数テンプレートは既に定義されています c:\program files\ Microsoft Visual Studio 8\vc\include\functional

それは何でしょうか?

前もって感謝します!!

0 投票する
9 に答える
115889 参照

c++ - stdcall と cdecl

stdcallcdeclという 2 種類の呼び出し規則があります。それらについていくつか質問があります。

  1. cdecl 関数が呼び出されたとき、呼び出し元はスタックを解放する必要があるかどうかをどのように判断しますか? 呼び出しサイトで、呼び出し元は、呼び出されている関数が cdecl 関数か stdcall 関数かを認識していますか? それはどのように機能しますか?呼び出し元は、スタックを解放する必要があるかどうかをどのように判断しますか? それともリンカーの責任ですか?
  2. stdcall として宣言されている関数が関数 (cdecl として呼び出し規則を持つ) を呼び出す場合、またはその逆の場合、これは不適切でしょうか?
  3. 一般的に、 cdecl と stdcall のどちらの呼び出しの方が速いと言えますか?
0 投票する
1 に答える
9043 参照

c - Cからアセンブリに引数を渡しますか?

Cのメイン関数からアセンブリ関数に引数を渡すにはどうすればよいですか?カスタム関数は次のようになっている必要があります。

somedataでは、アセンブリファイルでどのように使用しますか。私のオペレーティングシステムはLinuxUbuntuで、プロセッサはx86です。

0 投票する
4 に答える
512 参照

c - 次のコードは何をしますか?

重複の可能性:
C 宣言をどのように読みますか?

次のことがわかりません。

手伝ってくれますか?

0 投票する
8 に答える
14958 参照

c++ - 「cdecl」は何の略ですか?

はい、「cdecl」が有名な呼び出し規約の名前であることは知っています。そのため、呼び出し規約について説明しないでください。私が求めているのは、略語 (?) "cdecl" が実際に何を表しているかです。一見すると「C宣言子」(Cのかなりユニークな構文的側面)の1つを連想させるため、これは不適切な命名の選択だと思います。実際、 cdeclというプログラムがあり、その唯一の目的は C 宣言子を解読することです。しかし、C 宣言子の構文は、私が知る限り、呼び出し規約とはまったく関係がありません。

簡略版: 「stdcall」は「標準呼び出し規約」を表します。「cdecl」は何の略ですか?

0 投票する
4 に答える
1474 参照

.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 が発生する理由です。

0 投票する
1 に答える
793 参照

stack - stdcall と cdecl のスタック アラインメント サイズ

2 つの質問があります。

  1. stdcall 呼び出し規則のスタック アラインメントは常に4 バイトですか、それとも 32 ビット マシンの場合は 4 で、64 ビット マシンの場合は 8 ですか?
  2. cdecl のスタック アラインメント サイズは?

Microsoft Visual Studio 2010 を使用しています。