プロが教えるわが家の防犯対策術!

いつもお世話になっております。DLLでincludeしたものはexeでもincludeしなければならないのか疑問に思っています。
例えば、
DLL側である関数abc()内でWindowsMessage()を使用するために#include<windows.h>とインクルードした場合。
Exe側では関数abc()を使用するためにwindouw.hをインクルードしなければならないのでしょうか。

試してみた所、インクルードしなくてもうまくいったのですがたまたま何かしらでうまくいっていただけかもと不安に思ったので、一般的にはどうなのかと思い質問させていただきました。

A 回答 (2件)

「関数を呼んだら、呼んだ先の事は知らない」のがCやC++の良い所でもあり、悪い所でもあります。



以下のような「単純な例」で考えれば「インクルードは不要」だと判るでしょう。

【main.c】
void sub(void);/*sub()が何者なのかを宣言しておく*/
int main(void)
{
sub();
}

【sub.c】
#include <stdio.h>/*printf()を使うので必要*/
void sub(void)
{
printf("Hello world\n");
}

main.cで「printfを使うsub()を呼ぶから、main.cでも#include <stdio.h>が必要」とは思わないですよね。

「main.cはsub()を呼ぶだけだから、sub()の宣言だけする。sub()の中で何を呼ぼうが、そんな事は知ったこっちゃない」ので、main.cでは「一切、何のヘッダーもインクルードする必要はない」のです。

exeからDLLを呼ぶ時も同様で「exeはDLLの入り口さえ知ってれば良い」ので「DLLの中で何を使われていようが知ったこっちゃない」でOKなのです。
    • good
    • 0

*.hの内容によりますが、原理的には不要です。


一般にヘッダーの内容は「目論見(もくろみ)」なのであって
オブジェクトのリンクには深いかかわりはありません。

穏便な例としては、一般にDLL内部で使用される
公開されない関数もヘッダーでプロトタイプされますが、
これらの定義はEXE側に公開されません。つまりこのヘッダー
は使用できませんし、その必要もありません。

極端な例では、DLLをアセンブラのみで作成した場合、
DLL側では、そもそもC言語用のヘッダーは使用できません。
EXE側はDLLの公開関数の仕様をもらって、自分でヘッダー
を書く必要が出るでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!