http://www.ncad.co.jp/~komata/c-kouza26.htm
↑のページのコードを自分で書いてみましたが、
確かに概ね書いてる通りに動きました。
共有ライブラリの関数を使用するのに、
ヘッダファイルや関数プロトタイプは不要なのですか?
(動的)リンクの際に、mainより先に
共有ライブラリの関数が先に読み込まれているということですか?
http://d.hatena.ne.jp/sleepy_yoshi/20090510/p1
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>使う前に、定義されていれば、不要でしょうか?
>そうでなければ、プロトタイプ(?)宣言が必要?
使う前に宣言or定義がなければ、使われ方から推測された暗黙の宣言がされるだけです。
この「使う前に宣言or定義」にはライブラリ(共有ライブラリも含む)は含まれません。
gccで-Wallなど指定してコンパイルすれば
warning: implicit declaration of function 'my_func'
と警告されます。他のコンパイラでも同様になるはずです。
今回はたまたま暗黙の宣言で問題なかったというだけです。
>実際に自分でコーディングしてコンパイルして実行しましたが、
>概ね書いてある通りに動きました。
なぜそうなるのかも理解していないのに「実行して思った通りに動いたから」で納得するのは危険。
No.4
- 回答日時:
これは、単に、宣言の無い関数に自動で設定されるプロトタイプと、my_funcにプロトタイプが、たまたま矛盾がなかったにすぎません。
共有ライブラリでも静的なリンクでも同じことです。
cc -c my_func.c -o my_func.o # 静的なオブジェクトにコンパイル
cc main.c -o main my_func.o # 静的にリンク
でも同じ結果になります。
No.3
- 回答日時:
(言語仕様上必須ではないけど) 使う前に宣言 (定義を含む) をすべき, それだけです. 「共有ライブラリ」だろうと「単純にリンクするオブジェクトファイル」だろうと同じ.
あそこにあるのは「たまたまプロトタイプがなくても動く」ものでしかありません. 逆に「プロトタイプがないと困る」関数だったりするとやっぱり変なことになります. 例えば
double foo(int x)
{
return x;
}
だけのファイルから共有ライブラリを作り, それを使って
#include <stdio.h>
int main()
{
printf("%f\n", foo(1));
return 0;
}
を動かしてみてください.
No.2
- 回答日時:
どういう風に共有したいかで違ってきます。
ヘッダファイル内で記述したいというのは極普通の発想ですが、それは静的リンクです。
本ケースは依存関係をプログラム中に記述してしまうと
二重宣言に発展する恐れがあり、少し具合が悪いのです。
依存関係の確認は言語や統合環境によって色々変わってくるのですが、
大抵はパスを指定しておいて、コンパイル時に依存関係を参照して解決します。
共有領域はプログラムの生成時に同時に作成されます。
オブジェクト指向的にいえばmainのインスタンスが生成されると同時に領域が確保されます。
当然、main()本体が実行される以前にそれらは完了していなくてはなりません。
No.1
- 回答日時:
そもそも C では「ヘッダファイル」も「プロトタイプ」も必須じゃないからねぇ....
とはいえ, これは「たまたま」と思った方がいいです. 「ヘッダファイルは作る」「プロトタイプは書く」というクセは付けておくべきでしょう.
あ, その上のサイトの内容は「ちょ~古い」と言っていいから注意してね.
この回答への補足
ご回答ありがとうございます。
必須ではないのは、承知しております。
使う前に、定義されていれば、不要でしょうか?
そうでなければ、プロトタイプ(?)宣言が必要?
実際に自分でコーディングしてコンパイルして実行しましたが、
概ね書いてある通りに動きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
デコンパイル?について
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
” OS ビルド ” の意味が分か...
-
セミコロンについて
-
クリティカルエラー Expressio...
-
コンパイルエラー:ユーザ定義...
-
PRO*C コンパイルエラー
-
RPGでプログラムからソースファ...
-
VS2010でLibHaruをビルドした...
-
C++コンパイル時に『 C1083: in...
-
pyc 編集 閲覧
-
構造体をファイルに出力できません
-
定数式とはどういう意味でしょ...
-
C言語でヘッダファイルにグロー...
-
コンパイル??
-
[c++] <pthread.h>がinclude で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
C言語でヘッダファイルにグロー...
-
” OS ビルド ” の意味が分か...
-
マクロ コンパイルがグレーバック
-
【VC++6.0(MFC)】警告「LINK : ...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
[c++] <pthread.h>がinclude で...
-
<math.h>があるのにsqrtが・...
-
ビルドとリビルドの違いを教え...
-
CImageクラスの使用について
-
戻り値について
-
コンパイルエラー:ユーザ定義...
おすすめ情報