2017-10-18 164 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