我说我在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
});
的代码段
答案 0 :(得分:10)
这是一个使用复合文字的函数调用。它等同于以下内容:
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 standard更详细地介绍了这些内容。
从第6.5.2.5节开始:
4 由括号类型组成的后缀表达式 name后跟一个大括号括起来的初始化器列表是一个 复合文字。它提供了一个未命名的对象,其值为 由初始化列表给出。
...
9 示例1文件范围定义
int *p = (int []){2, 4};
初始化
p
以指向数组的第一个元素 两个整数,第一个具有值2,第二个具有值4。 此复合文字中的表达式必须是 不变。未命名的对象具有静态存储持续时间。
从第6.7.8节开始:
<强> 1 强>
initializer: 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 };
答案 1 :(得分:5)
这是C99以后的标准。它结合了复合文字:
(WindowHandlers) {}
和指定的初始化程序:
.load = main_window_load,
.unload = main_window_unload
查看链接 What does this dot syntax mean in the Pebble watch development tutorial?