这个C函数语法是什么?

时间:2016-08-11 21:48:45

标签: c function pebble-watch pebble-sdk procedural-programming

我说我在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 tutorial

的代码段

2 个答案:

答案 0 :(得分:10)

这是一个使用复合文字的函数调用。它等同于以下内容:

WindowHandlers temp = {
    .load = main_window_load,
    .unload = main_window_unload
  };
window_set_window_handlers(s_main_window, temp );

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

假设WindowHandlers按此顺序仅包含loadunload,则上述内容相当于:

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?