为什么我不能在Arduino IDE的另一个选项卡中声明一个类?


20

我想将我的一些代码移到Arduino IDE的第二个选项卡中,以使事情井井有条。刚开始,我只是尝试移动一个函数,它似乎运行良好。我可以从setup()主选项卡中的函数调用该函数,并且编译或上传都没有问题。

但是,我尝试将整个课程放到第二个选项卡中,突然它不再起作用。例如:

标签1:

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

标签2:

class TestClass
{
public:
    void init()
    {
        //...
    }
};

当我尝试对此进行编译时,它给了我以下错误:

tab1:1: error: 'TestClass' does not name a type
tab1.ino: In function 'void setup()':
tab1:5: error: 'obj' was not declared in this scope

为什么它可以识别另一个选项卡中的功能,但不能识别类?有什么方法可以使其在Arduino IDE中工作,还是需要使用类似Eclipse的替代方法?


这是整个代码吗?文件名是什么?是否没有像这样的预处理器指令#include
asheeshr 2014年

是的,这就是全部代码。这些选项卡分别命名为tab1tab2。名称是使用IDE设置的,因此基础文件都是.ino
彼得·布隆菲尔德

我开始讨厌Arduino IDE所带来的烦人的扑克游戏。它在AVR上的易用性增加了它在打破此类问题方面的优势。
Cyber​​gibbons 2014年

Answers:


13

无法在Arduino IDE中声明和使用.pde在另一个.pde文件中的一个文件中声明的类。

一种解决方法是将第二个文件转换为C ++源文件(.cpp),然后#include "<filename>"在第一个文件的开头添加指令。


这段代码可以正确编译:

标签1:

#include "test.cpp"

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

test.cpp:

class TestClass
{
public:
    void init()
    {
        //...
    }
};

感谢您的解决方法。它适用于基本示例,但是不幸的是,如果我在.cpp文件中添加任何特定于Arduino的调用,它将无法正常工作。例如,如果TestClass::init()尝试调用pinMode(),则编译器会抱怨pinMode未在此范围内声明。有没有一种方法可以访问我班上的Arduino函数?
彼得·布卢姆菲尔德

6
@ PeterR.Bloomfield #include <Arduino.h>.cpp文件顶部添加一个。
asheeshr 2014年

1
我认为教导他人包括源文件(#include "test.cpp")是不好的。它可以工作,但可能会妨碍对链接过程的理解。仅应包含头文件。
火星

1
我同意@Mars-更好的解决方案是将类声明放入.h文件中,并将定义(实现)放入.cpp文件中。因此,您在项目中有两个额外的文件。这实际上是处理类的正常方法。
尼克·加蒙

6

Arduino IDE的工作方式是将您的代码(您在IDE中编写的代码)编译为“主要”代码。然后,它从您导入的所有库中提取代码,并将其与主代码一起编译。要执行您建议的操作,将需要您为Arduino创建一个库。

这是有关Arduino库的更多信息:

http://arduino.cc/en/Guide/Libraries

以下是有关如何创建库的一些信息:

http://arduino.cc/zh-CN/Hacking/LibraryTutorial //这是最容易理解的imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html#

这是我编写的示例库https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister,因为您可以看到从.cpp文件调用Arduino函数没有问题(我知道,我已经测试了库)


3
它也可以只创建.h.cpp在您的主项目文件,而无需创建一个单独的库。
microtherion 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.