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:
}

और मेरे पास पाँच फाइलें हैं: 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 फ़ाइल में डाला जाता है #include

एक साइड नोट के रूप में: #includeकॉपी-एंड-पेस्ट का एक स्वचालित रूप है। यह तार्किक रूप से एक अन्य फ़ाइल (और इसके सभी पहुंच योग्य #includeका उपयोग करता है) की सामग्री को उस स्थान पर #includeरखता है जहां निर्देशन दिखाई दिया। यह उसी तरह का व्यवहार नहीं करता है जैसे अन्य भाषाओं में कई समान दिखने वाले निर्देश करते हैं। उदाहरण के लिए जावा या अजगर कहे #includeजाने वाले importकीवर्ड की तरह व्यवहार नहीं करता है।