下面的語句是一種簡寫嗎?我需要有人幫助我理解它。調試宏中的速記
#define clean_errno()(errno == 0? "None": strerror(errno))
從執行結果,我想這意味着一旦我面對clean_errno()
,如果errno ==0
,我代替clearn_errno()
與None
,如果沒有,我strerror(errno)
取代clean__errno()
。但我不知道如何從邏輯上分析這個陳述?運行時
下面的語句是一種簡寫嗎?我需要有人幫助我理解它。調試宏中的速記
#define clean_errno()(errno == 0? "None": strerror(errno))
從執行結果,我想這意味着一旦我面對clean_errno()
,如果errno ==0
,我代替clearn_errno()
與None
,如果沒有,我strerror(errno)
取代clean__errno()
。但我不知道如何從邏輯上分析這個陳述?運行時
的代碼進行評估,並遵循速記:
condition ? if_true : if_false
這速記非常類似於常規if else
聲明。
但是,與C中的正常if else
不同,縮寫可以用作表達式和語句。即:
char * str = 1 ? "true" : "false";
...不與if else
工作這麼好(char * str = if ...
可能會無法正常工作)。
試用0 ? "true" : "false"
並測試一下。
祝你好運!
預處理器宏在其調用站點中將替換爲。
這意味着像
printf("Error = %s\n", clean_errno());
聲明將
printf("Error = %s\n", (errno == 0? "None": strerror(errno)));
這將隨後在運行時請打印"None"
如果errno == 0
,否則打印strerror(errno)
結果進行更換。
至於?:
表達式本身,它是conditional (a.k.a. the ternary) expression,它的作用類似於if-else
。
但是,使用這樣的宏不是我會推薦的,因爲如果函數沒有失敗,errno
的值通常是未定義的。在檢查errno
之前,您需要確保之前的功能實際上確實失敗,在這種情況下,它永遠不會爲零。有很少地方errno
將被重置爲零,除非您事先明確地執行此操作,並且知道您調用的函數不會修改它,除非出現錯誤。
你說得對,就是這樣評估的。它是C語言的三元條件運算符。那麼問題是什麼呢? – SBS
只是替換上下文中的宏字符串,你會看到邏輯是如何工作的 –