初始化结构与功能用C
在初始化定义例如我有:初始化结构与功能用C
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中,而不是我的单元的FLASH。 (工具GNU C11)
首先,你甚至不能初始化静态存储持续时间为任何东西,但常量表达式的变量。这不会编译,无论是否使用你制作的“lambda”语法。您必须将变量声明放在本地范围内。
一旦处于本地范围,您只需在初始化程序列表中键入.check_value = value>10?value:10
即可。
我可以在本地静态作用域中进行初始化,并创建一个全局指针指向本地静态作用域? –
@VasilySukhoparov不知道你的意思是“本地静态作用域”。以上适用于具有_static存储duration_的任何变量:即,在文件范围(“globals”)处声明的所有变量以及声明为“static”的所有变量。如果你有一个普通的局部变量(自动存储持续时间),你当然可以从其他地方指向它,尽管局部变量最终会超出范围,之后指针将指向垃圾。 – Lundin
@VasilySukhoparov你试图解决的实际问题是什么?为什么以怪异格式输入你的'const'变量?你为什么不能纠正它? – Lundin
不是标准C. – StoryTeller
C没有像函数表达式(也称为lambda函数)的东西。 –
您应该将更新发布为答案。顺便说一下,聪明地使用gcc扩展。 – melpomene