質問: こんにちは。 質問が二つあります。 たまたまかもしれませんが。 ライブラリ(glewとか)のヘッダーファイルのほとんどがコールバック関数として宣言されている機会をよく目にするのですが、何か利点でもあるのでしょうか? また、ライブラリヘッダー内ではクラスを宣言してもいいのでしょうか? ライブラリ内での変数名を知られたくないなどの理由でクラスを使った設計が敬遠されているとかですかね。 ***コールバックで宣言されていることが多い*** ``` /* こんな形で書かれている関数をよく目にする。 ほとんどのシチュエーションでこの宣言を直に呼び出すことが多い。 */ typedef void (*func)(int val); func something(int val); /* それなら別にこうでもいいんじゃないか */ void something(int val); ``` ***ちなみにクラス宣言してはいけない理由でもあるのでしょうか*** ``` /* ライブラリ内でクラス宣言してはいけない理由ってあるのだろうか。 */ class A{ private: int a_val; ... }; /* ライブラリ使用元で基底クラスとして宣言したいのだが... */ class B : public A {}; ```
回答: > > それなら別にこうでもいいんじゃないか > > > いえ、上と下の宣言は**意味が違います**。上は`func`型という関数ポインタを返す関数、下は返り値のない関数です。 > > ちなみにクラス宣言してはいけない理由でもあるのでしょうか > > > C++のクラスはコンパイラによって全く形が違うために、コンパイル環境が違うと**リンクできません**。なので、APIは呼び出し規約などがはっきりしているC言語形式で作られることが大半です。