Arduino/C++ 枚举声明位置相关

问题描述 投票:0回答:3

我正在开发我的第一个 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++ 事物,那么这样做的合理性是什么?

c++ enums arduino
3个回答
2
投票

这是由于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 文件中结束


0
投票

代码应该编译,因此它似乎是环境中的一个错误。

解决方法是将

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(){}

0
投票

任何人都可以解释为什么需要在所有函数之前定义枚举吗?如果是一般的C++东西?

两个片段都格式良好,这似乎是 arduino IDE 特定的东西。

这是 Arduino IDE 的东西吗?

是的这似乎是 arduino IDE 特定的东西。

© www.soinside.com 2019 - 2024. All rights reserved.