为什么这段代码不能编译?

时间:2015-02-05 20:41:25

标签: c++ arduino

也许我很疯狂,但这段代码无法在Arduino IDE 1.0.5& 1.0.6。

class Foobar {};

void myFunction(const Foobar& n) {
}

void setup() {
}

void loop() {
}

编译器输出以下错误:

Arduino: 1.0.6 (Windows 7), Board: "Arduino Mega 2560 or Mega ADK"
C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega2560 -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106 -IC:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\variants\mega C:\Users\Alvaro\AppData\Local\Temp\build5499093930419069947.tmp\Max7219Testing.cpp -o C:\Users\Alvaro\AppData\Local\Temp\build5499093930419069947.tmp\Max7219Testing.cpp.o 

Max7219Testing:2: error: expected ',' or '...' before '&' token
Max7219Testing:2: error: ISO C++ forbids declaration of 'Foobar' with no type

这里有什么问题?

2 个答案:

答案 0 :(得分:0)

代码在这里完整编译:

http://ideone.com/AuDEQL

class Foobar {};

void myFunction(const Foobar& n) {
}

void setup() {
}

void loop() {
}

int main() {}

如果代码与您发布的一样,原因通常是

1)一个不可见的字符(通常是一个控制字符)嵌入在发生错误的前一行之一,而C ++解析器将其作为语法错误提取

2)您 在源文件中看到的字符不是ASCII,而是字符的某些“幻想”版本(因此是Unicode或其他编码)。如果您从使用备用编码的应用程序进行复制和粘贴以使文本“看起来很好”,例如MS Word等文字处理器,则会发生这种情况。

我将获取该文件并在十六进制编辑器中检查它以确保它没有这样的字符。

编辑:Ignacio Vazquez-Abrams在评论中指出的另一种情况是

3)您可能正在编译与您发布的文件不同的文件。这似乎是Arduino IDE的情况。

答案 1 :(得分:0)

哦我的$DEITY

根据Ignacio的建议,我检查了Arduino生成的最终组装的cpp文件,并且构建系统尝试编译:

#line 1 "sketch_feb05b.ino"
#include "Arduino.h"
void myFunction(const Foobar& n);
void setup();
void loop();
#line 1
class Foobar {};

void myFunction(const Foobar& n) {
}

void setup() {
}

void loop() {
}

因此,在声明类型之前,IDE会生成函数的声明并将它们放在文件的开头。

毕竟没有看不见的符号,只有Arduino作者的可怕决定: - (

我想知道将类型放在外部头文件中是否会修复它。