Arduino의 다중 정의 클래스

Nov 27 2020

여기서 도와주세요. 내가 뭘 놓치고 있는지 모르겠다. 내 arduino IDE 에이 코드가 있습니다.

#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

또는 클래스 정의 내에서 직접 함수 정의를 제공 할 수 있습니다. 이것은 또한 키워드가 inline필요하지 않아도 기능을 만듭니다 inline.

또는 Fooa인라인이 아닌 함수 로 유지하려면에서 했던 것처럼 정의를 헤더에서 .cpp 파일로 이동해야합니다 Foob().

함수를 인라인으로 만드는 것은 함수의 코드가 호출 사이트에서 생성되기를 원한다는 것을 의미하는 것 이상의 두 번째 효과입니다. 컴파일러 (또는 더 정확하게 링커)에게 함수에 대한 코드의 여러 정의 (동일해야 함)를 볼 것으로 예상합니다. 사전 알림 없이는 multiple definition of함수 정의가 .cpp 파일을 통해 여러 .cpp 파일에 삽입 될 때 오류가 발생합니다 #include.

참고로 : #include복사 및 붙여 넣기의 자동화 된 형태입니다. 논리적으로 다른 파일의 내용 (및 도달 가능한 모든 #include사용)을 #include지시문이 나타난 위치에 배치합니다 . 다른 언어에서 비슷한 모양의 많은 지시문과 동일한 방식으로 작동하지 않습니다. 예 를 들어 Java 또는 Python #include과 같은 import키워드 처럼 작동하지 않습니다 .