因此,我正在处理一些Arduino(IDE版本1.8.9,FWIW)代码,并且我发现如果放在函数定义之后,typedef似乎不起作用。例如,以下草图无法使用error: 'foo' does not name a type
进行编译,但是如果删除第一行,就没有问题。
bool baz() { return false; }
typedef uint32_t foo;
foo bar() { return 1; }
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
这是我不熟悉的typedef的工作方式的细微差别吗?某些特定于Arduino的奇怪之处?还是只是一个错误?
(请注意,uint32_t
的具体选择在这里无关紧要;任何类型都会发生相同的行为。)
答案 0 :(得分:4)
Arduino工具链包括一个预处理器,该预处理器试图简化C ++的编写。 Arduino的预处理器要做的一件事是在文件顶部的草图中插入所有函数的声明。这意味着传递给g ++的实际C ++代码如下所示:
#include <Arduino.h>
#line 1 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
#line 1 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
#line 1 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
bool baz();
#line 3 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
foo bar();
#line 5 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
void setup();
#line 10 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
void loop();
#line 1 "E:\\Documents\\Arduino\\sketch_jun16a\\sketch_jun16a.ino"
bool baz() { return false; }
typedef uint32_t foo;
foo bar() { return 1; }
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
如您所见,foo bar();
是在foo
引入名称typedef
之前声明的。
要解决此问题,请添加自己的bar
声明。 Arduino的预处理器只会添加您尚未声明的函数声明:
bool baz() { return false; }
typedef uint32_t foo;
foo bar();
foo bar() { return 1; }
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
关于typedef
是草图的第一行时这不是问题的原因:看起来像Arduino的预处理器提升了typedef
和using
声明以及现有的函数声明和类定义直到文件顶部,在它添加函数声明之前,但前提是它们出现在任何函数定义之前(不包括在类定义中内联定义的类成员函数)。