他のモジュール(他のファイル)の変数/関数にアクセスするために使用される "extern"キーワードの有用性について疑問を持ち始めています。 #includeプリプロセッサを使用して、変数/関数プロトタイプまたは関数/変数定義を持つヘッダファイルをインポートするときにも同じことをしていませんか?externと#includingヘッダファイルを使用する違いは何ですか?
14
A
答えて
17
extern
シンボルが存在し、特定のタイプのものであると宣言し、そのための記憶域を割り当てないため、必要です。
そうした場合:複数のソースファイル間で共有されているヘッダファイルに
int foo;
を各ソースがfooの独自のコピーを作成しなければならないと、リンカーはできませんので、あなたはリンカエラーが発生しますシンボルを解決する。
代わりに、あなたが持っている場合:ヘッダで
extern int foo;
、それは、各ソースファイルの別の場所で定義されたシンボルを宣言します。
1つだけのソースファイルは、解決するリンカーのFOOの単一のインスタンスを作成
int foo;
を含むであろう。
2
いいえ#includeは "この他のファイルのすべてのテキストをここに置く"というプリプロセッサコマンドです。したがって、インクルードされたファイルのすべての関数と変数は、現在のファイルで定義されています。
関連する問題
- 1. Rustのextern fnとextern "C" fnの違いは何ですか?
- 2. Cのintとextern intの違いは何ですか?
- 3. XPathの//と?/の違いは何ですか?の使用は何
- 4. フレーズクエリとシングルフィルタを使用する違いは何ですか?
- 5. ソースファイルの定義中にヘッダファイルに "EXTERN"キーワードを使用
- 6. middlegenとXDocletの使用とその違いは何ですか?
- 7. requests.getとrequests_session.getを使用した違いは何ですか?
- 8. 「extern __forceinline」というC++イディオムは何ですか?
- 9. GitVersionを使用すると、NuGetVersionV2とNuGetVersionの違いは何ですか
- 10. Akka 2のディスパッチャの違いと使用パターンは何ですか?
- 11. トーチ:net:cuda()とcudnn.somemodulesの使用の違いは何ですか
- 12. エンティティとexpandoの使用の違いは何ですか?
- 13. os.path.isdir()の使用時に './'と '../'の違いは何ですか?
- 14. ScopedDisposableとtake(使用中の間:...)の違いは何ですか?
- 15. size_tとoff_tの使用法の違いは何ですか?
- 16. TextFieldデリゲートとReactiveCocoaでtextSignalを使用する違いは何ですか?
- 17. bsClassとclassNameをreact-bootstrapで使用する点の違いは何ですか?
- 18. AxiosとjQueryをHTTPリクエストで使用する際の違いは何ですか?
- 19. XPathクエリで "../"と "parent"を使用する違いは何ですか?
- 20. React.jsでthis.propsとpropsを使用する違いは何ですか?
- 21. AndroidでAppCompatActivityとActivityを使用する違いは何ですか?
- 22. Pythonで '@ patch.object'と 'with patch.object'を使用する違いは何ですか?
- 23. ::との違いは何ですか?エイリアスが使用されるときC#で?
- 24. Parallel.ForEachとTask.Factory.StartNewを使用する主な違いは何ですか?
- 25. hrefとonclickを使用するリンクの違いは何ですか?
- 26. Axios apisで使用するRedux-ThunkとRedux-Promiseの違いは何ですか?
- 27. クライアント側で使用するRESTとHTTPライブラリの違いは何ですか?
- 28. EventEmitterの使用と関数の使用の違いは何ですか?
- 29. `extern" C "vsネイティブC++ライブラリを使用してCライブラリを使用する場合の欠点は何ですか?
- 30. 「アソシエーション」と「リレーション」という用語の違いは何ですか?
しかし、定義を含むヘッダファイルをインクルードしていれば、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の有無にかかわらず動作することがわかります。だから、あなたはそれについて明確にしようとするべきです。共有グローバル変数に入るときには、本当に明確にする必要がありますが、コンパイラによってはそれを把握するものもあれば、そうでないものもあります。 –