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

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

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

2回答

1200閲覧

ライブラリヘッダーの多くがコールバック関数で宣言されている理由

NoBeVo

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2019/10/17 06:20

編集2019/10/17 06:22

こんにちは。

質問が二つあります。

たまたまかもしれませんが。
ライブラリ(glewとか)のヘッダーファイルのほとんどがコールバック関数として宣言されている機会をよく目にするのですが、何か利点でもあるのでしょうか?

また、ライブラリヘッダー内ではクラスを宣言してもいいのでしょうか?
ライブラリ内での変数名を知られたくないなどの理由でクラスを使った設計が敬遠されているとかですかね。

コールバックで宣言されていることが多い

C

1 2/* 3こんな形で書かれている関数をよく目にする。 4ほとんどのシチュエーションでこの宣言を直に呼び出すことが多い。 5*/ 6typedef void (*func)(int val); 7func something(int val); 8 9/* 10それなら別にこうでもいいんじゃないか 11*/ 12void something(int val); 13 14 15

ちなみにクラス宣言してはいけない理由でもあるのでしょうか

C++

1/* 2ライブラリ内でクラス宣言してはいけない理由ってあるのだろうか。 3*/ 4class A{ 5private: 6 int a_val; 7 ... 8}; 9 10/* 11ライブラリ使用元で基底クラスとして宣言したいのだが... 12*/ 13class B : public A {}; 14

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

glewがクラスを使っていないのは、単にC言語だからではないでしょうか?
C言語にクラスはありませんし。

また、そのsomethingはコールバックではないです。関数ポインタです。
なぜわざわざ関数ポインタで宣言しているのか調べていませんが、例えば動的リンク・ライブラリを動的にロードする場合にはそのように宣言することになります。動的ロードに対応しているのではないでしょうか?

投稿2019/10/17 06:32

Chironian

総合スコア23272

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

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

NoBeVo

2019/10/17 06:48 編集

そういえば、実際のコードには #define GLEWAPI __declspec(dllexport) #define GLEW_FUN_EXPORT GLEWAPI ...中略 GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; のようなコードがたくさんありました。 __declspec っというのがマイクロソフトのコンパイラ固有???の定義らしく、dllからのインポートorエクスポートされたことをコンパイラ に示すとかなんとか... 見ていると多くの場合でこれが使われており、__declspecの宣言のためにtypedefしてるってことなんでしょうか。 ありがとうございます。
guest

0

それなら別にこうでもいいんじゃないか

いえ、上と下の宣言は意味が違います。上はfunc型という関数ポインタを返す関数、下は返り値のない関数です。

ちなみにクラス宣言してはいけない理由でもあるのでしょうか

C++のクラスはコンパイラによって全く形が違うために、コンパイル環境が違うとリンクできません。なので、APIは呼び出し規約などがはっきりしているC言語形式で作られることが大半です。

投稿2019/10/17 06:26

maisumakun

総合スコア145971

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問