使用C中初始化程序中定义的函数初始化struct

时间:2017-10-18 10:57:28

标签: c struct

例如我有:

typedef struct {
    uint32_t* param_ptr;
    uint32_t (*check_value)(uint32_t);
} Parameter;

uint32_t a = 8;
const Parameter work = { .param_ptr = &a, .check_value =  (uint32_t value) {return value>10?value:10;} };

int main1(void) {
    //check
    *work.param_ptr = work.check_value(*work.param_ptr);
}

我想申报' mini' struct初始化中的函数。因为有很多参数'我不想宣布单独的函数及其正文,并将其名称传递给初始化。无论如何要这样做?

UPD1:

#define lambda(return_type, function_body) \
({ \
      return_type __fn__ function_body \
          __fn__; \
})

typedef struct {
    uint32_t* param_ptr;
    uint32_t (*check_value)(uint32_t);
} Parameter;

uint32_t a = 8;

void main(void) {
    Parameter work = { .param_ptr = &a, .check_value = lambda(uint32_t, (uint32_t value){return value > 10 ? value : 10;}) };
    *work.param_ptr = work.check_value(*work.param_ptr);
}

感谢您的评论,我发现了关键字的熟悉QA。好吧,这种方式工作正常,但有些缺点 - 它不是全局常量,因此保存在RAM中,而不是我的mcu的FLASH。 (工具GNU C11)

1 个答案:

答案 0 :(得分:1)

首先,您甚至无法将具有静态存储持续时间的变量初始化为除常量表达式之外的任何变量。无论是否使用你的“lambda”语法,都无法编译。您必须将变量声明放在本地范围内。

在本地范围内,您只需在初始化列表中键入.check_value = value>10?value:10即可。