无法传递 `#define` 作为函数参数,但可以传递 `#define` 的数组[n]

标签 c pointers struct

我的结构是:

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

为什么会发生这种情况? BTN0btn[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/

相关文章:

当您取消引用空指针时,您能证明为什么强制转换很重要吗?

arrays - 在 Swift 中保留一组自定义结构

c - 使用结构指针的内存分配问题

c - 如何从 C 中的 IPv4 地址获取主机名?

c - Bad ptr 错误阻止将指针复制到指针数组

c++ - 将指向成员函数的指针转换为普通指针

c - 使用函数为链表创建项目时丢失数据(并添加随机节点)

执行线程时更改C线程参数

c - 重定向标准输入

c - 在 Struct 中动态分配二维数组(在 C 中)