arduinoの複数定義クラス

Nov 27 2020

ここで私を助けてください。何が足りないのかわかりません。私は私の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

私が間違っていること

よろしく、

回答

timemage Nov 27 2020 at 08:23

あなたがしたい場合はFooa()、複数の.cppファイルに含めることができ、ヘッダで定義されていることを、あなたはそうのようなインライン関数として宣言する必要があります:

#ifndef Foo_H
#define Foo_H

class Foo
{
    public:
    Foo();

    public:
    inline bool Fooa();
    bool Foob();
};
#endif

または、クラス定義内に直接関数定義を指定することもできます。これによりinlineinlineキーワードを必要としないにもかかわらず、関数も作成されます。

またはFooa、非インライン関数として保持する場合は、Foob()。で行ったように、定義をヘッダーから.cppファイルに移動する必要があります。

関数をインライン化すると、呼び出しサイトで関数のコードを生成することを意味する以外に、2番目の効果があります。関数のコードの複数の定義(同一である必要がある)が表示されることを期待するようにコンパイラー(またはより正確にはリンカー)に通知します。その事前のmultiple definition of通知なしに、関数定義が.cppファイルに#include。を介して挿入されると、エラーが発生します。

補足として:#includeは、コピーアンドペーストの自動化された形式です。別のファイルの内容(およびその到達可能なすべての#include使用が推移的に使用される)を、#includeディレクティブが出現した場所に論理的に配置します。他の言語の多くの似たようなディレクティブと同じようには動作しません。たとえば#includeimportJavaやPythonなどのキーワードのようには動作しません。