我正在开发我的第一个 arduino 项目,在那里我遇到了以下我想理解的行为。以下代码编译没有问题:
enum TestEnum {TestValue1};
void test(){}
void setup(){}
void loop(){}
void foo(TestEnum &testArg) {}
但是交换前两行
void test(){}
enum TestEnum {TestValue1};
void setup(){}
void loop(){}
void foo(TestEnum &testArg) {}
编译时出现以下错误:
D:\Path\to\Arduino-Sketches\foo\foo.ino:5:10: error: variable or field 'foo' declared void
void foo(TestEnum &testArg) {}
^~~~~~~~
D:\Path\to\Arduino-Sketches\foo\foo.ino:5:10: error: 'TestEnum' was not declared in this scope
D:\Path\to\Arduino-Sketches\foo\foo.ino:5:10: error: note: suggested alternative: 'isalnum'
D:\Path\to\Arduino-Sketches\foo\foo.ino:5:20: error: 'testArg' was not declared in this scope
D:\Path\to\Arduino-Sketches\foo\foo.ino:5:20: error: note: suggested alternative: 'test'
void foo(TestEnum &testArg) {}
^~~~~~~
test
任何人都可以解释为什么需要在所有函数之前定义枚举吗?这是 Arduino IDE 的东西吗?如果它是一般的 C++ 事物,那么这样做的合理性是什么?
这是由于Arduino将.ino文件预处理为.cpp文件造成的。这是出于“方便”的原因,因此初学者不必添加原型(您只能在声明或定义函数后使用它们),当然还有#include
void test(){}
enum TestEnum {TestValue1};
void setup(){}
void loop(){}
void foo(TestEnum &testArg) {}
将预处理为:
#include <Arduino.h>
#line 1 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
#line 1 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
void test();
#line 3 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
void setup();
#line 4 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
void loop();
#line 5 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
void foo(TestEnum &testArg);
#line 1 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_446733\\sketch_feb19a.ino"
void test(){}
enum TestEnum {TestValue1};
void setup(){}
void loop(){}
void foo(TestEnum &testArg) {}
正如您所看到的,所有函数原型(声明)都出现在任何函数定义之前(例如在 test() {} 之前)
当您将函数定义移到枚举定义之后时,结果如下:
#include <Arduino.h>
#line 1 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
enum TestEnum {TestValue1};
#line 2 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
void test();
#line 3 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
void setup();
#line 4 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
void loop();
#line 5 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
void foo(TestEnum &testArg);
#line 2 "C:\\Users\\mikusm\\AppData\\Local\\Temp\\arduino_modified_sketch_473375\\sketch_feb19a.ino"
void test(){}
void setup(){}
void loop(){}
void foo(TestEnum &testArg) {}
注意
enum TestEnum {TestValue1};
在真正的 .cpp 文件中结束
代码应该编译,因此它似乎是环境中的一个错误。
解决方法是将
foo
放入 namespace
:
void test(){}
enum TestEnum {TestValue1};
void setup(){}
void loop(){}
namespace {
void foo(TestEnum &testArg) {}
}
或者将 Arduino 不需要的所有函数和其他定义放在
namespace
:
namespace {
void test(){}
enum TestEnum {TestValue1};
void foo(TestEnum &testArg) {}
}
// leave these in the global namespace:
void setup(){}
void loop(){}
任何人都可以解释为什么需要在所有函数之前定义枚举吗?如果是一般的C++东西?
两个片段都格式良好,这似乎是 arduino IDE 特定的东西。
这是 Arduino IDE 的东西吗?
是的这似乎是 arduino IDE 特定的东西。