![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
}
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パーソナルXLSBのfuctionを呼び...
-
VB2010からPROCEDUREを実行でエ...
-
VB.NETでのイベントの途中終了
-
VBAでcallで呼び出したsubを終...
-
C言語のサフィックスについて
-
C#のループでtextboxに値を入れ...
-
アクセスできない保護レベルエ...
-
vb.net 文字コードから漢字へ変換
-
他のフォームから別のフォーム...
-
レコードセットにnullの場合
-
タイムアウトする仕組みを作りたい
-
VBAで入力数値について
-
WORd VBA 文章を単語に分解する
-
エクセルVBAでテキストボッ...
-
ACCESS VBA 文字抽出について ...
-
リストビューの列ヘッダーの幅...
-
構造体のコピー
-
subsequentとnextの違いってな...
-
入力された値の動的取得方法に...
-
[vb.net] 起動したFrom2を閉じ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プロシージャまたは関数の引数...
-
【VB6.0】 あるフォームから他...
-
【VBScript】変数のスコープ
-
【HTML、VBScript】HTAアプリケ...
-
PL/SQLのプロシージャ間でカー...
-
ExcelのVBA。Staticな変数について
-
整数を二つ読み込み、それらの...
-
プロシージャを呼び出したプロ...
-
パーソナルXLSBのfuctionを呼び...
-
定数を構造体で・・・
-
プログラムの素朴な質問です 分...
-
引き渡したループ処理で変数がn...
-
SOP
-
HTML + VBScript で Sleep でき...
-
変数を複数のモジュール間で共...
-
引数
-
関数の引数
-
Excel vba で複数のテキストの...
-
subプロシージャーですか?sub...
-
VB初心者の私に教えてください!
おすすめ情報