電子書籍の厳選無料作品が豊富!

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;
}

A 回答 (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(){
の誤りですよね。

最後に、コンパイル環境不明ですがリンク順も要注意かな
    • good
    • 0
この回答へのお礼

皆様ありがとうございます。
私の考え方が少し違っていたみたいで使い方がおかしいようなので、新しく質問をさせていただきます。
また#4様のご指摘どおりvoid sabは誤りでした。

お礼日時:2006/02/27 15:09

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)などとしたほうが良いと思いますが...
    • good
    • 0

> ----------(main.h)----------


> char a[100];

これをmain.cppとsub.cppの二箇所からインクルードしているからです。
aの定義はどちらか一方で行い、main.hの中では外部宣言のみ(具体的にはexternをつける)にすれば、解決します。
    • good
    • 0

エラーメッセージの言っている通りです。



"main.h"の変数aは、main.cppで既に使われているためです。
sub.cppで再度変数aを使おうとしています。

関数subへ引数として変数aを渡せばよいような気がしますけれど。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!