arduinoの複数定義クラス
ここで私を助けてください。何が足りないのかわかりません。私は私のarduinoIDEにこのコードを持っています
#include "Foo2.h"
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
そして、私は5つのファイルを持っています:Foo.h、Foo.cpp、Foo2.h、Foo3.cpp、Foo.h
Foo.h
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
bool Fooa();
bool Foob();
};
#endif
Foo.cpp
#include "Foo.h"
Foo::Foo()
{
}
bool Foo::Foob()
{
return true;
}
Foo2.h
#ifndef Foo2_H
#define Foo2_H
#define LIBRARY_VERSION 1.0.0
#include "Foo.h"
bool Foo::Fooa()
{
return true;
}
#endif
Foo3.h
#ifndef Foo3_H
#define Foo3_H
#include "Foo2.h"
class Foo3
{
public:
Foo3();
Foo _foo;
};
#endif
Foo3.cpp
#include "Foo3.h"
Foo3::Foo3()
{
}
そしてそれは私にエラーを与えます:
libraries\Foo\Foo3.cpp.o (symbol from plugin): In function `Foo::Fooa()':
(.text+0x0): multiple definition of `Foo::Fooa()'
sketch\kk2.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
私が間違っていること
よろしく、
回答
あなたがしたい場合はFooa()
、複数の.cppファイルに含めることができ、ヘッダで定義されていることを、あなたはそうのようなインライン関数として宣言する必要があります:
#ifndef Foo_H
#define Foo_H
class Foo
{
public:
Foo();
public:
inline bool Fooa();
bool Foob();
};
#endif
または、クラス定義内に直接関数定義を指定することもできます。これによりinline
、inline
キーワードを必要としないにもかかわらず、関数も作成されます。
またはFooa
、非インライン関数として保持する場合は、Foob()
。で行ったように、定義をヘッダーから.cppファイルに移動する必要があります。
関数をインライン化すると、呼び出しサイトで関数のコードを生成することを意味する以外に、2番目の効果があります。関数のコードの複数の定義(同一である必要がある)が表示されることを期待するようにコンパイラー(またはより正確にはリンカー)に通知します。その事前のmultiple definition of
通知なしに、関数定義が.cppファイルに#include
。を介して挿入されると、エラーが発生します。
補足として:#include
は、コピーアンドペーストの自動化された形式です。別のファイルの内容(およびその到達可能なすべての#include
使用が推移的に使用される)を、#include
ディレクティブが出現した場所に論理的に配置します。他の言語の多くの似たようなディレクティブと同じようには動作しません。たとえば#include
、import
JavaやPythonなどのキーワードのようには動作しません。