1. ホーム
  2. c++

c++ 変数は .h ヘッダーファイルで定義してはいけません (main は *.obj solution で既に定義されています) 。

2022-02-11 09:40:37

元のアドレス: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 ファイルで定義してはいけません。