他のモジュール(他のファイル)の変数/関数にアクセスするために使用される "extern"キーワードの有用性について疑問を持ち始めています。 #includeプリプロセッサを使用して、変数/関数プロトタイプまたは関数/変数定義を持つヘッダファイルをインポートするときにも同じことをしていませんか?externと#includingヘッダファイルを使用する違いは何ですか?
14
A
答えて
17
extern
シンボルが存在し、特定のタイプのものであると宣言し、そのための記憶域を割り当てないため、必要です。
そうした場合:複数のソースファイル間で共有されているヘッダファイルに
int foo;
を各ソースがfooの独自のコピーを作成しなければならないと、リンカーはできませんので、あなたはリンカエラーが発生しますシンボルを解決する。
代わりに、あなたが持っている場合:ヘッダで
extern int foo;
、それは、各ソースファイルの別の場所で定義されたシンボルを宣言します。
1つだけのソースファイルは、解決するリンカーのFOOの単一のインスタンスを作成
int foo;
を含むであろう。
2
いいえ#includeは "この他のファイルのすべてのテキストをここに置く"というプリプロセッサコマンドです。したがって、インクルードされたファイルのすべての関数と変数は、現在のファイルで定義されています。
関連する問題
- 1. Cのintとextern intの違いは何ですか?
- 2. フレーズクエリとシングルフィルタを使用する違いは何ですか?
- 3. middlegenとXDocletの使用とその違いは何ですか?
- 4. Akka 2のディスパッチャの違いと使用パターンは何ですか?
- 5. size_tとoff_tの使用法の違いは何ですか?
- 6. XPathクエリで "../"と "parent"を使用する違いは何ですか?
- 7. ::との違いは何ですか?エイリアスが使用されるときC#で?
- 8. クライアント側で使用するRESTとHTTPライブラリの違いは何ですか?
- 9. Axios apisで使用するRedux-ThunkとRedux-Promiseの違いは何ですか?
- 10. 「アソシエーション」と「リレーション」という用語の違いは何ですか?
- 11. C++でexternを使用するとエラーが発生する
- 12. Javaで使用されるピークと最大メモリの違いは何ですか?
- 13. ここに欠けているヘッダファイル(Cコード)は何ですか?
- 14. difftimeと ' - 'の違いは何ですか?
- 15. A`と ``の違いは何ですか[:] `
- 16. $ dirtyと$ invalid:違いは何ですか?
- 17. `&`と `ref`の違いは何ですか?
- 18. バックスティックと$()の違いは何ですか?
- 19. Backbone.jsとPusherapp - 違いは何ですか?
- 20. `##`と `hashCode`の違いは何ですか?
- 21. "$^N"と "$ +"の違いは何ですか?
- 22. libspeとlibspe2?違いは何ですか?
- 23. #{} $ {}と%{}の違いは何ですか?
- 24. typedefとの違いは何ですか?
- 25. %Qと%{}の違いは何ですか?
- 26. `==`と `is`の違いは何ですか?
- 27. $と$$の違いは何ですか?
- 28. NodeJS:「./ ..」と「..」の違いは何ですか?
- 29. &&と||を使用した場合の違いは何ですか? do ... whileループで?
- 30. joblibとpickleの使い方の違いは何ですか?
しかし、定義を含むヘッダファイルをインクルードしていれば、extern int fooで宣言することなくint fooにアクセスできますか? –
jcopenhaが言及しているように、#includeはインクルードファイルのテキストをソースファイルに挿入するだけです。コンパイラはインクルードファイルを本当に認識せず、特別に処理しません。ですから、それぞれが "int foo"を持ち、それらをリンクしているA.c、B.c、C.cを持っているなら、どのようにfooを解決しますか?それは3つの異なる場所に存在します。 externは、シンボルがどこかに存在することを意味します。あなたはそれを使うことができますが、誰かがそれを作成する責任があります。 – Michael
foo_fun()のインスタンスが1つしかない関数では、foo_fun()を呼び出すモジュールがexternの有無にかかわらず動作することがわかります。だから、あなたはそれについて明確にしようとするべきです。共有グローバル変数に入るときには、本当に明確にする必要がありますが、コンパイラによってはそれを把握するものもあれば、そうでないものもあります。 –