簡體   English   中英

有人可以用C解釋這種宏和函數語法嗎?

[英]Can someone explain this Macro and function syntax in C?

我討厭問這個問題,但是經過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中見過像這樣的句點。 這個定義構造本質上是一個setter函數嗎?

這是一個c99 指定的初始化程序

您可以使用它以任何順序初始化結構成員(或數組元素)。

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

您只能指定一些成員和任何順序。 被忽略的成員被初始化為好像它們是靜態對象。

初始化某種結構時,此宏旨在提供便利。 假設結構定義是這樣的:

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

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

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

像這樣使用宏比使用適當的功能好還是要取決於系統的細節。 這種方式在編譯之前會在擴展時消耗更多的靜態程序內存,但是它將防止每次初始化這樣的對象時推送新的堆棧幀。

我發現宏比函數更難調試,但是您的工作量可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM