2017-10-18 165 views
2

在初始化定义例如我有:初始化结构与功能用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)

+1

不是标准C. – StoryTeller

+0

C没有像函数表达式(也称为lambda函数)的东西。 –

+0

您应该将更新发布为答案。顺便说一下,聪明地使用gcc扩展。 – melpomene

回答

1

首先,你甚至不能初始化静态存储持续时间为任何东西,但常量表达式的变量。这不会编译,无论是否使用你制作的“lambda”语法。您必须将变量声明放在本地范围内。

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

+0

我可以在本地静态作用域中进行初始化,并创建一个全局指针指向本地静态作用域? –

+0

@VasilySukhoparov不知道你的意思是“本地静态作用域”。以上适用于具有_static存储duration_的任何变量:即,在文件范围(“globals”)处声明的所有变量以及声明为“static”的所有变量。如果你有一个普通的局部变量(自动存储持续时间),你当然可以从其他地方指向它,尽管局部变量最终会超出范围,之后指针将指向垃圾。 – Lundin

+0

@VasilySukhoparov你试图解决的实际问题是什么?为什么以怪异格式输入你的'const'变量?你为什么不能纠正它? – Lundin