gpt4 book ai didi

c - 使用 C 中初始化器中定义的函数初始化结构

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:46 24 4
gpt4 key购买 nike

例如我有:

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);
}

我想在结构初始化中声明“迷你”函数。由于有很多“参数”,我不想声明单独的函数及其主体,并将其名称传递给初始化。无论如何要这样做?


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 的闪存中。 (工具 GNU C11)

最佳答案

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

一旦进入局部作用域,您只需在初始化列表中键入 .check_value = value>10?value:10

关于c - 使用 C 中初始化器中定义的函数初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46808589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com