我的结构是:
typedef struct {
GPIO_TypeDef* port;
uint16_t pin;
} btn;
一些定义:
#define BTN0 {App_BTN_GPIO_Port, App_BTN_Pin}
#define BTN1 {Calibration_BTN_GPIO_Port, Calibration_BTN_Pin}
//...
按钮数组:
btn btns[] = {BTN0, BTN1, ...}
也是一个函数:
bool checkPressAndReleaseWithMask(btn button){
if (HAL_GPIO_ReadPin(button.port, button.pin) == GPIO_PIN_RESET) {
//bla bla bla
}
}
我遇到以下问题。当我想调用这个函数时,我无法传递我的定义:
btn find1BTN()
{
btn test = {App_BTN_GPIO_Port, App_BTN_Pin};
if(checkPressAndReleaseWithMask(btns[0])){ //allright
} else if (checkPressAndReleaseWithMask(test)){ //allright
} else if (checkPressAndReleaseWithMask(BTN0)){ //PROBLEM
}
return test;
}
btn[0]
和 test
工作正常,但 BTN0
不行。我也尝试过:
if (checkPressAndReleaseWithMask({.port = App_BTN_GPIO_Port, .pin = App_BTN_Pin})){ //PROBLEM
}
同样的编译时问题:
error: expected expression
为什么会发生这种情况? BTN0
和 btn[0]
有什么区别?他们看起来是一样的!
{.port = App_BTN_GPIO_Port, .pin = App_BTN_Pin}
怎么样?我记得,我们可以通过这种方式传递结构,不是吗?
我还检查了this 。这不是我的问题。
注意:随意更改主题。我找不到更好的了。
最佳答案
复合文字的正确语法是:
( type ) { initializer-list }
所以代码需要是:
checkPressAndReleaseWithMask((btn)BTN0);
或者
#define BTN0 ((btn){App_BTN_GPIO_Port, App_BTN_Pin})
checkPressAndReleaseWithMask(BTN0);
关于无法传递 `#define` 作为函数参数,但可以传递 `#define` 的数组[n],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68789614/