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

http://www.ncad.co.jp/~komata/c-kouza26.htm

↑のページのコードを自分で書いてみましたが、
確かに概ね書いてる通りに動きました。

共有ライブラリの関数を使用するのに、
ヘッダファイルや関数プロトタイプは不要なのですか?

(動的)リンクの際に、mainより先に
共有ライブラリの関数が先に読み込まれているということですか?






http://d.hatena.ne.jp/sleepy_yoshi/20090510/p1

A 回答 (5件)

>使う前に、定義されていれば、不要でしょうか?


>そうでなければ、プロトタイプ(?)宣言が必要?

使う前に宣言or定義がなければ、使われ方から推測された暗黙の宣言がされるだけです。
この「使う前に宣言or定義」にはライブラリ(共有ライブラリも含む)は含まれません。

gccで-Wallなど指定してコンパイルすれば

warning: implicit declaration of function 'my_func'

と警告されます。他のコンパイラでも同様になるはずです。

今回はたまたま暗黙の宣言で問題なかったというだけです。

>実際に自分でコーディングしてコンパイルして実行しましたが、
>概ね書いてある通りに動きました。

なぜそうなるのかも理解していないのに「実行して思った通りに動いたから」で納得するのは危険。
    • good
    • 0

これは、単に、宣言の無い関数に自動で設定されるプロトタイプと、my_funcにプロトタイプが、たまたま矛盾がなかったにすぎません。



共有ライブラリでも静的なリンクでも同じことです。
cc -c my_func.c -o my_func.o # 静的なオブジェクトにコンパイル
cc main.c -o main my_func.o # 静的にリンク
でも同じ結果になります。
    • good
    • 0

(言語仕様上必須ではないけど) 使う前に宣言 (定義を含む) をすべき, それだけです. 「共有ライブラリ」だろうと「単純にリンクするオブジェクトファイル」だろうと同じ.



あそこにあるのは「たまたまプロトタイプがなくても動く」ものでしかありません. 逆に「プロトタイプがないと困る」関数だったりするとやっぱり変なことになります. 例えば
double foo(int x)
{
return x;
}
だけのファイルから共有ライブラリを作り, それを使って
#include <stdio.h>
int main()
{
printf("%f\n", foo(1));
return 0;
}
を動かしてみてください.
    • good
    • 0

どういう風に共有したいかで違ってきます。


ヘッダファイル内で記述したいというのは極普通の発想ですが、それは静的リンクです。

本ケースは依存関係をプログラム中に記述してしまうと
二重宣言に発展する恐れがあり、少し具合が悪いのです。

依存関係の確認は言語や統合環境によって色々変わってくるのですが、
大抵はパスを指定しておいて、コンパイル時に依存関係を参照して解決します。

共有領域はプログラムの生成時に同時に作成されます。
オブジェクト指向的にいえばmainのインスタンスが生成されると同時に領域が確保されます。
当然、main()本体が実行される以前にそれらは完了していなくてはなりません。
    • good
    • 0

そもそも C では「ヘッダファイル」も「プロトタイプ」も必須じゃないからねぇ....



とはいえ, これは「たまたま」と思った方がいいです. 「ヘッダファイルは作る」「プロトタイプは書く」というクセは付けておくべきでしょう.

あ, その上のサイトの内容は「ちょ~古い」と言っていいから注意してね.

この回答への補足

ご回答ありがとうございます。

必須ではないのは、承知しております。

使う前に、定義されていれば、不要でしょうか?
そうでなければ、プロトタイプ(?)宣言が必要?

実際に自分でコーディングしてコンパイルして実行しましたが、
概ね書いてある通りに動きました。

補足日時:2012/06/05 01:41
    • good
    • 0

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