mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。
何が間違っているのでしょう・・。
エラーメッセージ
error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。
fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。
と表示されます。ファイルソースは以下です。どなたか教えてください><
----------(main.h)----------
char a[100];
----------(main.cpp)----------
#include<stdio.h>
#include "main.h"
#include "sub.h"
int main(){
sprintf(a,"hello.");
sub_write();
return 0;
}
-----------(sub.h)-----------
void sub_write();
-----------(sub.cpp)-------------
#include <stdio.h>
#include "main.h"
#include "sub.h"
void sab(){
printf("%s\n",a);
}
return;
}
No.4ベストアンサー
- 回答日時:
エラーメッセージのとおり。
グローバル変数 char a[100]が重複します。
回避するには、main.hを書き換えましょう。↓
#ifndef hoge_main_h_included_hogehoge
#define hoge_main_h_included_hogehoge
char a[100]; // ←元からある部分
#endif // hoge_main_h_included_hogehoge
これはむか~~しからインクルードガードと呼ばれ、
同じヘッダファイルが複数回includeされないようにする方法でござんす。
また、sub.cpp 4行目の
void sab(){
は、
void sub_write(){
の誤りですよね。
最後に、コンパイル環境不明ですがリンク順も要注意かな
皆様ありがとうございます。
私の考え方が少し違っていたみたいで使い方がおかしいようなので、新しく質問をさせていただきます。
また#4様のご指摘どおりvoid sabは誤りでした。
No.3
- 回答日時:
main.hでchar a[100]が宣言されているためです。
この状態だと、main.cppとsub.cpp両方でchar a[100]が定義されてしまうため、エラーとなります。(同じシンボル名が存在するため)
解決するためには、
main.hでは広域変数を宣言しない
main.cppにてchar a[100]を宣言する
sub.cppにてextern char a[]として、外部で宣言されているものを定義する
とすれば大丈夫です。
本当は広域変数はできる限り使用せず、void sub_write(const char *a)などとしたほうが良いと思いますが...
No.2
- 回答日時:
> ----------(main.h)----------
> char a[100];
これをmain.cppとsub.cppの二箇所からインクルードしているからです。
aの定義はどちらか一方で行い、main.hの中では外部宣言のみ(具体的にはexternをつける)にすれば、解決します。
No.1
- 回答日時:
エラーメッセージの言っている通りです。
"main.h"の変数aは、main.cppで既に使われているためです。
sub.cppで再度変数aを使おうとしています。
関数subへ引数として変数aを渡せばよいような気がしますけれど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VB6.0】 あるフォームから他...
-
【HTML、VBScript】HTAアプリケ...
-
プロシージャまたは関数の引数...
-
VB2010からPROCEDUREを実行でエ...
-
PL/SQLのプロシージャ間でカー...
-
パーソナルXLSBのfuctionを呼び...
-
プロシージャを呼び出したプロ...
-
VB.NETでのイベントの途中終了
-
テキストボックスを空白にする方法
-
C#のループでtextboxに値を入れ...
-
Matlabでsin波を使って矩形波を...
-
チェックボックスを操作できな...
-
Excel ユーザーフォームで計算 ...
-
ExcelVBAで他のファイル(proje...
-
【VB.NET】テキストボックスに...
-
TextBoxの内容を右寄せ
-
String型の値にスラッシュをつ...
-
VB6でClickイベントを一時的に...
-
他のフォームから別のフォーム...
-
ClickとChangeイベントの違いは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB6.0】 あるフォームから他...
-
プロシージャまたは関数の引数...
-
定数を構造体で・・・
-
パーソナルXLSBのfuctionを呼び...
-
PL/SQLのプロシージャ間でカー...
-
プロシージャを呼び出したプロ...
-
【HTML、VBScript】HTAアプリケ...
-
【VBScript】変数のスコープ
-
VB6のFriendについて
-
HTML + VBScript で Sleep でき...
-
プログラムの素朴な質問です 分...
-
ExcelのVBA。Staticな変数について
-
Callで呼び出したプロシージャ...
-
変数の宣言はすべきでしょうか...
-
access2007 copyfile困っています
-
C++からfortran77を呼び出す
-
Excel VBA カーソルを当てた際...
-
BATファイルでstartからcallを...
-
SOP
-
整数を二つ読み込み、それらの...
おすすめ情報