这个C函数语法是什么?

lav*_*ode 6 c procedural-programming function pebble-watch pebble-sdk

我说我在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
  });
Run Code Online (Sandbox Code Playgroud)

这是Pebble WatchApp教程的代码片段.

dbu*_*ush 10

这是一个使用复合文字的函数调用.它相当于以下内容:

WindowHandlers temp = {
    .load = main_window_load,
    .unload = main_window_unload
  };
window_set_window_handlers(s_main_window, temp );
Run Code Online (Sandbox Code Playgroud)

上面还使用了指定的初始值设定项,您可以在其中指定要按名称初始化的字段.

假设WindowHandlers只包含loadunload在该顺序中,上述等效于:

WindowHandlers temp = { main_window_load, main_window_unload };
window_set_window_handlers(s_main_window, temp );
Run Code Online (Sandbox Code Playgroud)

C标准进入更详细的了解.

从6.5.2.5节:

4后缀表达式由一个带括号的类型名称后跟一个括号括起的初始化列表组成,是一个 复合文字.它提供了一个未命名的对象,其值由初始化列表给出.

...

9示例1文件范围定义

int *p = (int []){2, 4};
Run Code Online (Sandbox Code Playgroud)

初始化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
Run Code Online (Sandbox Code Playgroud)

...

7如果指定人员有表格

.identifier
Run Code Online (Sandbox Code Playgroud)

那么当前对象(下面定义)应具有结构或联合类型,标识符应该是该类型成员的名称.

...

34示例10可以将结构成员初始化为非零值,而不依赖于它们的顺序:

div_t answer = { .quot = 2, .rem = -1 };
Run Code Online (Sandbox Code Playgroud)


小智 5

这是C99以后的标准配置.它结合了复合文字:

(WindowHandlers) {}
Run Code Online (Sandbox Code Playgroud)

和指定的初始化者:

.load = main_window_load,
.unload = main_window_unload
Run Code Online (Sandbox Code Playgroud)

请参阅链接 Pebble手表开发教程中此点语法的含义是什么?