有人可以在C中解释这个宏和函数语法吗?

时间:2014-07-07 17:29:23

标签: c macros c-preprocessor

我讨厌提出这个问题,但是经过3到4年的编程后,我从未见过像这段代码那样的宏。

#define CREATE_FIXED_FIELD(Label, LabelFrame, ValueFrame, NextFrame, GetValue, SetValue, Digits, Fraction, Min, Max) \
{Label, LabelFrame, EditValue, ValueFrame, NextFrame, FixedDisplay, FixedBeginEdit, FixedFinishEdit, FixedKeyPressed, FixedHighlight, .fixed = {GetValue, SetValue, Digits, Fraction, Min, Max}}

现在我知道你可以使用define来创建常量,但我从来不知道你可以将它们用作函数。它实际上是花括号的第二行让我失望。它究竟做了什么?第二行中的变量是否设置为第一行中的值?我认为它将用作函数实现,但看起来并非如此。最后,.fixed变量是什么?我知道它是某种形式的结构,但我从来没有在 C 中看到像以前那样使用的时期。这个define构造本质上是一个setter函数吗?

2 个答案:

答案 0 :(得分:2)

这是一个c99 指定的初始化程序

您可以使用它以任何顺序初始化结构成员(或数组元素)。

struct bla {
   int a;
   int b;
} x = { .a = 42, .b = 0};

您只能指定一些成员和任何订单。省略了省略的成员,就好像它们是静态对象一样。

答案 1 :(得分:2)

此宏用于初始化某种结构时的便利性。假设结构定义是这样的:

typedef struct FixedField {
    char *label,
    Frame *labelFrame,
    // ...
    Fixed fixed,
    // ... Possibly more here ...
} FixedField;

然后您可以使用该宏来初始化FixedField,如下所示:

FixedField ff = CREATE_FIXED_FIELD(myLabel, myLabelFrame, /* ... */);

使用这样的宏是否比使用正确的函数更好取决于系统的细节。这种方式在编译之前会消耗更多的静态程序存储器,但每次初始化这样的对象时都会阻止推送新的堆栈帧。

我发现调试宏比功能更难,但你的里程可能会有所不同。

相关问题