c++ 変数は .h ヘッダーファイルで定義してはいけません (main は *.obj solution で既に定義されています) 。
元のアドレス:http://blog.csdn
NET
/tianwailaibin/article/details/6239380
オリジナルブログアドレス: http://blog.csdn.net/u010536615/article/details/50250747
ヘッダーファイルで変数を定義すると、コンパイラがエラーを報告します。
main は *.obj で既に定義されています。
ヘッダー内の#ifndef、これは致命的です。例えば、2つのCファイルがあり、両方とも同じヘッダーファイルをインクルードしているとします。そしてコンパイル時には、この2つのCファイルは一緒にコンパイルされて1つの実行可能ファイルになるため、多くの宣言の衝突が発生するという問題が生じます。
ヘッダーファイルの内容は、#ifndefと#endifに記述したほうがよいでしょう。これは、ヘッダーファイルが複数のファイルから参照されるかどうかに関係なく付けたいものです。一般的な書式は次のようなものです。
#ifndef <logo>
#define <logo>
......
......
#endif
<logo> は理論的には自由に命名できますが、この "logo" はヘッダーファイルごとにユニークであるべきです。ロゴの命名の一般的なルールは、ヘッダファイル名を大文字にしてアンダースコアを付け、ファイル名の "." をアンダースコアにして、例えば stdio.h のように下線も付けることです。
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
2. ifndefでの変数定義の問題(一般に#ifndefでは定義されない)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
の中に変数の定義があります。
cでは正常にコンパイルされるのに、vcでリンクするとi重複定義エラーが発生します。
結論
(1). このヘッダを使った最初の.cppが.objを生成すると、その中でint iが定義される これを使った別の.cppが再び[別々に]objを生成すると、int iが再び定義されて、このヘッダーも含む別の.cppによって2つのobjが結合されます。
(2). ソースプログラムのファイルの拡張子を.cに変更した後、VCは次のようにします。
C言語
の構文で、C++の代わりにソースプログラムを作成します。その中で
c言語
で、int i が複数ある場合、1つは自動的に定義とみなされ、他は宣言になります。
(3).C言語とC++言語ではリンク結果が異なるので、おそらく(推測)コンパイル時にC++言語はグローバルに
C言語では、初期化されているかどうかで、接続の強弱を判断しています。(参考)
解決策
(1). ソースプログラムのファイルの拡張子を.cに変更する。
(2). 推奨される解決策
.h で extern int i のみ宣言し、.cpp で定義する。
<x.h>
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__
<x.c>
int i;
質問にご注意ください。
一般に、変数は .h ファイルで定義してはいけません。
関連
-
[解決済み】C++の戻り値、参照、const参照
-
[解決済み】c++エラー:配列の添え字に無効な型 'int[int]' があります。
-
[解決済み】strlen()使用時に「このスコープでは宣言されていません。)
-
[解決済み] エラーです。C++はすべての宣言に型指定子を必要とします。
-
[解決済み] トークン ']' の前に期待される一次式 [閉じた] 。
-
[解決済み] x86アセンブリの「ロック」命令の意味を教えてください。
-
[解決済み] メッセージボックスで変数を表示する c++
-
[解決済み] SFML 2.1 と Codeblocks エラー: sfml-graphics-2.dll がコンピュータにありません。
-
[解決済み] はクラスタイプ C++ を持ちません。
-
[解決済み] IplImage* から cv::MAT への変換.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】C++で配列を印刷する?
-
[解決済み】glm::lookAt()を理解する)
-
[解決済み] char' から 'const char *' への変換が無効です。
-
[解決済み] error : a nonstatic member reference must be relative to the specific object "とはどういう意味ですか?
-
[解決済み] cmakeでヘッダのみのライブラリを作るには?
-
[解決済み] for(;i<=m;i++)とはどういう意味ですか?[重複]です。
-
[解決済み] ミニダンプを読むにはどうしたらよいですか?
-
[解決済み] std::stringをLPCSTRに変換する方法は?
-
[解決済み] C++ - ハッシュ値を結合するのにboost::hash_combineが最適なのはなぜですか?