我想说我有c编程的中级经验,但是我从来没有见过用这种语法来创建函数。这让我想起了JQuery事件的语法。总的来说,我希望详细解释这是什么以及替代语法可能是什么。如果能给我一个链接,让我能读到更多关于这方面的内容,那就太好了。
// Set handlers to manage the elements inside the Window
window_set_window_handlers(s_main_window, (WindowHandlers) {
.load = main_window_load,
.unload = main_window_unload
});
这是来自Pebble WatchApp教程的代码片段
这是一个使用复合文字的函数调用。它相当于以下内容:
WindowHandlers temp = {
.load = main_window_load,
.unload = main_window_unload
};
window_set_window_handlers(s_main_window, temp );
上面的代码还使用了指定初始化器,你可以通过名称指定要初始化的字段。
假设WindowHandlers
只按顺序包含load
和unload
,则上述等价于:
WindowHandlers temp = { main_window_load, main_window_unload };
window_set_window_handlers(s_main_window, temp );
C标准对这些有更详细的说明。
来自6.5.2.5节:
4由带括号的类型组成的后缀表达式名称后跟用大括号括起来的初始化式列表是复合文字。它提供了一个未命名的对象,其值为由初始化列表给出。
…
9
int *p = (int []){2, 4};
初始化
p
指向数组的第一个元素两个int型,第一个值为2,第二个值为4。这个复合字面值中的表达式必须是常数。未命名对象具有静态存储持续时间。
出自第6.7.8节:
1initializer: assignment-expression { initializer-list } { initializer-list , } initializer-list: designationopt initializer initializer-list , designationopt initializer designation: designator-list = designator-list: designator designator-list designator designator: [ constant-expression ] .identifier
…
7如果指示符的形式为
.identifier
则当前对象(定义如下)应具有结构或联合类型,标识符应为的成员的名称类型。
…
34示例10结构成员可以初始化为非零值,而不依赖于它们的顺序:
div_t answer = { .quot = 2, .rem = -1 };
这是自1999年以来的标准。它组合了复合字面值:
(WindowHandlers) {}
和指定初始化式:
.load = main_window_load,
.unload = main_window_unload
见链接在Pebble watch开发教程中,点语法是什么意思?