簡體   English   中英

“ #define setId(ptr,value)((ptr)-> id =(value),0)是什么意思

[英]what is the meaning of "#define setId(ptr, value) ((ptr)->id = (value), 0)

當我閱讀某人的代碼時,遇到了不熟悉的代碼。 代碼如下:

struct Employee {
    int id;
};
#define getId(ptr)  ((ptr)->id)
#define setId(ptr, value) ((ptr)->id = (value), 0)

我不明白((ptr)->id = (value), 0) 這個宏與((ptr)->id = (value)嗎?

我不了解((ptr)->id = (id), 0) 這個宏像((ptr)->id = (id)嗎?

,是預處理器宏中復雜返回上下文使用逗號運算符

因此,當您將其稱為宏時,它將設置員工的ID,然后返回0 (這只是程序員的設計決定,可能旨在僅返回0表示“無錯誤”)。

但是正如其他人在評論中指出的那樣,該宏的定義可能有誤,它可能看起來像:

#define setId(ptr) ((ptr)->id = (id), 0)

我不明白“(((ptr)-> id =(id),0)””。 此宏是否與“(((ptr)-> id =(id))””相同?

假設宏定義為:

#define setId(ptr, name) ((ptr)->id = (name), 0)

如果你有表達

a = setId(ptr, name);

它擴展到

a = ((ptr)->id = (name), 0);

當執行該表達式時, a值為0 ,這是逗號表達式((ptr)->id = (name), 0) 評估表達式的副作用是ptr指向的對象的id成員設置為name

您發布的代碼似乎是錯誤的:

#define setId(ptr, name) ((ptr)->id = (id), 0)

setId宏可能應該使用name參數而不是某些本地id標識符。 如果name是一個整數,則可能是這樣:

#define setId(ptr, name) ((ptr)->id = (name), 0)

否則,可能是這樣的:

#define setId(ptr, name) ((ptr)->id = nameToId(name), 0)

關於, 0)部分,它是逗號運算符的一個實例:宏擴展為一個表達式,該表達式求值賦值,然后求值0 如果使用setId(ptr, name)的結果,則其值將始終為0 這樣的結構不是很可讀,可能會在某些編譯器上生成警告。

這些宏代替了“ setter”和“ getter”功能。 假設“ setter”應返回0表示成功,返回-1表示失敗,函數將如下所示

int getId( struct Employee *ptr )
{
    return( ptr->id );
}

int setId( struct Employee *ptr, int value )
{
    ptr->id = id;
    return 0;       // this setter always succeeds
}

用宏替換吸氣劑很簡單。 替換設置器比較麻煩,因為您需要“返回”正確的值。 那是逗號運算符有用的地方。

逗號運算符計算第一個表達式並丟棄結果。 然后,它計算第二個表達式,並將第二個表達式的結果用作逗號運算符的結果。 因此,setter宏的總值為0。

暫無
暫無

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

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