我讨厌提出这个问题,但是经过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函数吗?
答案 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, /* ... */);
使用这样的宏是否比使用正确的函数更好取决于系统的细节。这种方式在编译之前会消耗更多的静态程序存储器,但每次初始化这样的对象时都会阻止推送新的堆栈帧。
我发现调试宏比功能更难,但你的里程可能会有所不同。