【问题标题】:"expected unqualified-id before numeric constant" from #define ANSWERSIZE 5#define ANSWERSIZE 5 中的“数字常量之前的预期不合格 ID”
【发布时间】:2020-03-26 13:40:10
【问题描述】:

已经阅读了很多帖子,但看不出为什么这行代码会产生错误。这个程序很简单——它使用 I2C 总线来允许从 MASTER Arduino UNO 到从 Arduino UNO 的通信。 下面的代码是MASTER的代码和定义,“#define ANSWERSIZE 5”是编译器不喜欢的那行。

下面的完整程序:

#include <Wire.h>
#define ANSWERSIZE 5  // <--- THIS LINE GENERATES THE ERROR
#define SLAVE_ADDR 9

void setup() {

Wire.begin();
Serial.begin(9600);
Serial.println("I2C MASTER Demonstration");
}

void loop() {
delay(50);
Serial.println("Write data to SLAVE");
Wire.beginTransmission(SLAVE_ADDR);
Wire.write(0);
Wire.endTransmission();
Serial.println("Receive data from SLAVE");
Wire.requestFrom(SLAVE_ADDR.ANSWERSIZE);
String response = "";
while (Wire.available()) {
  char b = Wire.read();
  response += b;
}
Serial.println(response);
}

【问题讨论】:

  • 问题很可能出在 Wire.h
  • Wire.requestFrom(SLAVE_ADDR.ANSWERSIZE); ...urks... requestFrom 是否采用浮点值?为什么不使用常量而不是滥用预处理器?
  • Wire.requestFrom(SLAVE_ADDR.ANSWERSIZE); 等价于Wire.requestFrom(9.5); 也许应该是逗号,
  • @JohnFileau 不太...
  • @idclev463035818 我今天学到了一些关于#define的东西

标签: c++ arduino arduino-uno


【解决方案1】:

您可以look at the output of the preprocessor with gcc -E。例如:

#define SLAVE_ADDR 9
#define ANSWERSIZE 5
Wire.requestFrom(SLAVE_ADDR.ANSWERSIZE);

将扩展到

Wire.requestFrom(9 . 5);

由于9. 5 不是浮点文字,您会收到错误消息。要修复它,不要滥用预处理器来处理想要/应该是常量的东西。我想说:“预处理器从来都不是这样使用的”,但不幸的是,这有着悠久的传统,即使(现在)没有充分的理由这样做,也很难摆脱旧习惯.

改用常量:

const int SLAVE_ADDR = 9;
const int ANSWERSIZE = 5;
const double COMPLETE_ADDR = 9.5;

如果你不喜欢重复,或者更复杂的东西。

PS:我不确定requestFrom 实际期望的参数是什么,所以我试图接近你的代码。即使正确的调用是Wire.requestFrom(9, 5);,我也不会使用宏。

【讨论】:

    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多