複数のソースで使用される可能性のある変数がある場合は、ヘッダーに宣言することをお勧めしますか?またはそれを.c
ファイルで宣言し、他のファイルでextern
を使用する方が良いですか?ヘッダーファイルの変数宣言
答えて
あなたはヘッダファイルに変数を宣言する必要があります:その.cファイルもヘッダーを使用する必要がありますし、標準パターンがどのように見えることをことを
注
extern int x;
とをで定義します。ファイル:
int x;
Cでは、定義と宣言の違いは変数のスペースを予約しているのに対し、宣言は変数をシンボルテーブルに導入するだけです(リンカが来たらリンクする時間)。
ヘッダーファイルにextern
と宣言し、正確に1cファイルで定義することができます(必要があります)。
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
実際には、ヘッダーを常に使用する必要があります。そのため、コンパイラが宣言と定義の間で型が間違ってしまう場合に備えてください。 – caf
猫、あなたは正しい、私は少し言い直します。 –
あなたが複数の場所に含まれるヘッダファイル内
int x;
ようにそれを宣言する場合は、xの複数のインスタンスになってしまいます(および潜在的にコンパイルやリンクの問題)。
これにアプローチするための正しい方法は、ヘッダファイルを持つことです
extern int x; /* declared in foo.c */
を言った後、foo.cの中で、あなたは、あなたができるだけ多くのあなたのヘッダーファイルをインクルードすることができます
int x; /* exported in foo.h */
を言うことができますあなたが好きな場所。
キーは、ヘッダファイルとソースファイルの変数の宣言を同じに保つことです。
は私が
------sample.c------
#define sample_c
#include sample.h
(rest of sample .c)
------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int x;
SAMPLE.Cは一度だけコンパイルされ、このトリックを使用して、それは、変数を定義します。 sample.hを含むファイルには変数の "extern"しか与えられません。その変数にスペースを割り当てます。
xのタイプを変更すると、すべての人が変更されます。ソースファイルとヘッダーファイルで変更する必要はありません。
このソリューションについてはどうなりますか?
#ifndef VERSION_H
#define VERSION_H
static const char SVER[] = "14.2.1";
static const char AVER[] = "1.1.0.0";
#else
extern static const char SVER[];
extern static const char AVER[];
#endif /*VERSION_H */
私が見るのは、同じファイルに2回インクルードすると、インクルードガードで保存されないということだけです。
1)#ifndefガードは、単一の*ソースファイル内で複数の定義ができないようにします(したがって、extern定義は何もしません)。 2)ヘッダー内の静的変数を宣言すると、それを含む各ソースファイルは、単一の共有変数ではなく、その変数の独自のバージョンを持ちます。技術的にはこれはリンクされますが、動作が望ましくない場合があります(この例ではconst変数を使用したように気付かないかもしれませんが、const以外のものに使用してください)。受け入れられた答えは、ほとんど常に適切な解決策です。 – Assimilater
- 1. は、Qtのクラス宣言ヘッダーファイル
- 2. 私のヘッダーファイルのメソッドを宣言する
- 3. ヘッダーファイルのクラス宣言についてC++
- 4. ヘッダーファイル内でクラスオブジェクトを宣言する
- 5. ヘッダーファイルの静的なグローバル関数を宣言する
- 6. 宣言SQL変数 -
- 7. if節の変数宣言
- 8. Java変数の宣言
- 9. 変数宣言の問題
- 10. ココア変数の宣言
- 11. アセット宣言の変数
- 12. スイッチヘッドの変数宣言?
- 13. 変数宣言の問題
- 14. C++クラスとメソッドを宣言し、メンバーは宣言していないヘッダーファイル?
- 15. グローバル変数宣言問題
- 16. C++メソッド変数宣言
- 17. 再宣言はJavaScript変数
- 18. @ sign in C変数宣言
- 19. Javascript変数宣言問題
- 20. MYSQL宣言した変数
- 21. Javaparser AST変数宣言
- 22. 目的C:@property宣言とインスタンス変数の宣言
- 23. C複数の変数宣言
- 24. 変数を複数回宣言する
- 25. のIntelliJの書式変数の宣言
- 26. ヘッダーファイルに空のクラス宣言がありますか?
- 27. PL宣言時の変数のデフォルト値
- 28. JavaScriptの変数の宣言と設定
- 29. if/elseブロック内の変数の宣言
- 30. Swiftのクラス内の変数宣言
**どちらも**宣言です!ファイルスコープでは、2番目の定義は(完全な)定義ではなく、_tentative定義です。 – Olaf