Arduino में एकाधिक परिभाषा वर्ग
यहाँ मेरी मदद करो। मुझे नहीं पता कि मुझे क्या याद आ रहा है। मेरे पास मेरी 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
मैं क्या गलत कर रहा हूँ
सादर,
जवाब
यदि आप 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
कीवर्ड की तरह व्यवहार नहीं करता है।