Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 11 months ago.
mbed標準で用意されているクラスを複数のファイルから使えるようにするにはどうしたらよいのでしょうか
これは、言語の基本的な事柄かと思うのですが、理解できておらず申し訳ありませんが、ずっと困っていて、周囲に質問できる人もいないため、ここで質問させていただきます。
PWMでブザーを鳴らしたい。KL25Zを使っています。
PwmOut Buzz(PTD4); main(){ Buzz=0.5; Buzz.period_ms(1); }
これはこれでOKなのですが、このmain.cppで定義したBuzzをほかのファイルからも使えるようにするにはどうしたらよいのでしょうか。
たとえば、複数の音を鳴らすため、Buzzer関数をいくつか作って、oto.h,oto.cppに関数を作ります。 で、その関数の中で、Buzz=0.5 とかしたいのですが。
どこかで一回定義したら使えるような気がして main.cppのPwmOut の定義を削除して、oto.hにそれを書いて、main.cppからoto.hをincludeすると、二重に定義されていますとのエラーになります。(一箇所しかないのに)
1 Answer
9 years, 11 months ago.
こんばんは。
こちらが参考になるのではないでしょうか? http://d.hatena.ne.jp/saitodevel01/20110321/1300685958
ヘッダファイルではなく、ひとつのソースファイルに定義を書いて、別のソースから参照する場合は extern 宣言を使う方法です。共通のヘッダファイルに extern 宣言しても良いと思います。
Quote:
関数や計算するだけのクラスを作って、externを使うとエラーにならないんですが、同じことを、PwmOutやDigitalInなどでやるとエラーを出してくれるんです。
なるほど。コードを見ないと何とも言えないんですが、extern 宣言の方はインスタンス名だけ宣言されていますか?定義の方と全く同じように記述してしまうと、コンストラクタを呼ぶコードになってしまって、多重定義のエラーが出ると思います。
例えば、定義側のコードが以下のようになっているとすると:
別ソースのextern宣言を使ったコードは、以下のように記述します。
おお!、ありがとうございます!おっしゃるとおりです。 とおりました。 mbedを使い始めてから、1年以上たつんですが、なんでできないんかわからず、 いつもmain.cppの中に、全部の記述を書いてました。見づらくて見づらくて。 これでまたたくさん遊べそうです。
posted by Imayan chan 03 Mar 2015