🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

6615閲覧

関数の呼び出し規約「CALLBACK」の意味を教えてください。

Ryo99_1001

総合スコア25

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/13 18:57

編集2019/11/13 19:01

関数の呼び出し規約(特にCALLBACK)の意味

VC++ 2019 communityで、windows.hをインクルードしてWINAPIを利用し自分でウィンドウを作成しようとしているのですが、関数の呼び出し規約について疑問があります。

該当のソースコード

C++

1#include "windows.h" 2 3LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){ 4 () 5} 6 7int WINAPI WinMain(){ 8 () 9}

上記のソースコードで、WinMain関数の「WINAPI」、WinProc関数の「CALLBACK」はともに__stdcallと定義されていますが、見かけ上使い分けられています。どちらも同じ呼び出し規約を指しているだけだと思うのですが、これには何か理由があるのでしょうか。

また、WinProc関数の呼び出し規約「CALLBACK」はいわゆるコールバック関数とは全くの別物で無関係と考えてよいのでしょうか。

的外れな質問かもしれませんが是非ご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

WinMain関数の「WINAPI」、WinProc関数の「CALLBACK」はともに__stdcallと定義されていますが、見かけ上使い分けられています。どちらも同じ呼び出し規約を指しているだけだと思うのですが、これには何か理由があるのでしょうか。

異なるCPUの場合、異なる定義になっている可能性があるのです。現在一緒なのは、現CPUの場合は同じ定義で問題ないだけです。
これはマルチプラットフォームなプログラムを開発する際によく用いられる手法の1つです。

このQAも参考になりそうです。

投稿2019/11/13 19:14

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryo99_1001

2019/11/13 20:06

CALLBACKに別の定義も書かれていたのですね。環境が変わったときに対応できるようにしていることがわかりました。回答ありがとうございました。
guest

0

ベストアンサー

「結果的に同じ内容であっても, 見かけ上使い分ける」というのは, プログラミングではよくある手法です.
__stdcall で言えば, 単なる呼び出し規約に加えて「何故その呼び出し規約なのか」をコード上で示すことができます.

で, WinProc() は恐らく RegisterClass(Ex) の引数である WNDCLASS(EX) などに使う WNDPROC 用の関数だと思いますが, 全くの別物どころか, まさにコールバック関数として使うものです.
RegisterClass(Ex) によって登録され, ウィンドウイベントが発生するたびに API 側から呼ばれます (コールバックされます).
CALLBACK は「API 側がコールバックするよ」と示しているのです.

投稿2019/11/13 19:23

kagilinn

総合スコア354

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryo99_1001

2019/11/13 20:04

コールバック関数の知識がまだ乏しく気付かなかったのですがよく見たら確かにWinProc()はコールバックされていました。 可読性を上げるために使い分けているということですね、納得しました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問