トップページ > 過去ログ > 記事閲覧
cppファイルの分け方
名前:奈々氏 日時: 2008/05/06 20:11

はじめまして。よろしくお願いします。 ・a.h、a.cpp、b.cppを作りました。 ・a.hにa.cppとb.cppの両方で使う変数や、関数のプロトタイプの宣言をしました。 ・a.cppがメインソースで、b.cppにはa.cppが呼び出して使う関数の中身が書いてあります。 ・まずa.cppに関数の中身を書いて、エラーが出なかったので関数をb.cppに移し、b.cppの冒頭に #include "dxstdafx.h" #include "resource.h" #include "a.h" と書いてビルドを通したところ、"error LNK2005 int iは既にa.objで定義されています" と言うエラーと"fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。"というエラーが出ました。 ソースを分ける作業が初めてなので、解決方法が分かりません。どなたかご教授お願いします。

Page: 1 |

Re: cppファイルの分け方 ( No.1 )
名前:憂煉 日時:2008/05/06 23:32

とりあえず解決方法。 a.hの"int i;"の前に"extern"を付けて、a.cppかb.cppの好きな方に"int i"を書いてください。 以下適当な説明。exeファイル生成物語(?) 登場人物 コンパイラ:ソースコードを読んで機械語を生成する。    文法にミスがあるとエラーを吐いて止まる。 リンカ:コンパイラが作った機械語を読んで実際に動くプログラムを作る。    同じ名前のデータが複数あると「どっち使えばいいの?」とエラーを吐いて止まる。 第一幕。奈々氏さんがコンパイルした時に起きた出来事 奈々氏さんがソースを書きました。 コンパイラがソースを読みました。  a.cppをコンパイルする時にa.hを一緒に読み込んで、iという変数を作りました。  b.cppをコンパイルする時にもa.hを一緒に読み込んでiという変数を作りました。 リンカがa.cppとb.cppから作られた機械語を読みました。  さあ大変。iという変数が二箇所にあります。リンカはどっちのiを使えばいいのか解りません。  困ったリンカはエラーを吐いて止まってしまいました。 BAD END "LNK2005" 第二幕。修正を行ったソースで起こる出来事 ソースが修正されました。"int i;"はb.cppに書かれました。 コンパイラがa.cppを読みました。中にあった関数がiという変数を使いたがっていました。  "extern int i;"という記述が一緒に読み込んだa.hにあったので、後はリンカに任せることにしました。 コンパイラがb.cppを読みました。"int i;"という記述があったのでiという変数を作りました。 リンカがa.cppとb.cppから作られた機械語を読みました。  a.cppから作られた機械語に「iという変数をここから使えるようにしてね」というコンパイラからのメッセージがありました。  b.cppから作られた方にiという変数があったのでそれをつなぎました。  こうして、めでたくexeファイルが作られました。 めでたしめでたし。
Re: cppファイルの分け方 ( No.2 )
名前: 日時:2008/05/07 11:13

少し技術的に。 このような問題はコンパイルエラーを小手先で 直すと後々痛い目を見るので、根本を治す事を お勧めします。(自分の為にも、他人の為にもです。) 今後やるべきことは、以下です。 ・変数になるべく、意味のある名前をつける。  (iでは何の変数なのか全く不明。iやjは特に ループ用のカウンタ変数としてよく使われるが もしループカウンタであるなら、関数内で毎回、 きちんと定義してあげる事。関数を跨ぐ場合は   この限りではないですが、その場合も以下の  ようなことに注意します。) ・別々の関数で使いたい変数があっても  できる限り引数で渡してグローバル変数を避ける  (引数で渡さないと、いつどこで、誰が変更する  のかが分からなくなり、コンパイルできても  正常に動かないときに困る。  もしも引数が多くなってきた場合は、構造体に  纏めて引数を少なくすることも考える。) この2つを意識して、コードを書き直したり、 していればその内、簡単にファイルわけできるよう になります。 今後の為に、少しずつ意識していくと良いかと。
Re: cppファイルの分け方 ( No.3 )
名前:きう 日時:2008/10/30 18:55

どうやったらパソコンの ファイルおわけらせるの

Page: 1 |