[英]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))””相同?
假設宏定義為:
#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.