2017-08-07 21 views
0

下面的語句是一種簡寫嗎?我需要有人幫助我理解它。調試宏中的速記

#define clean_errno()(errno == 0? "None": strerror(errno)) 

從執行結果,我想這意味着一旦我面對clean_errno(),如果errno ==0,我代替clearn_errno()None,如果沒有,我strerror(errno)取代clean__errno()。但我不知道如何從邏輯上分析這個陳述?運行時

+2

你說得對,就是這樣評估的。它是C語言的三元條件運算符。那麼問題是什麼呢? – SBS

+0

只是替換上下文中的宏字符串,你會看到邏輯是如何工作的 –

回答

2

的代碼進行評估,並遵循速記:

condition ? if_true : if_false 

這速記非常類似於常規if else聲明。

但是,與C中的正常if else不同,縮寫可以用作表達式和語句。即:

char * str = 1 ? "true" : "false"; 

...不與if else工作這麼好(char * str = if ...可能會無法正常工作)。

試用0 ? "true" : "false"並測試一下。

祝你好運!

6

預處理器宏在其調用站點中將替換爲

這意味着像

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將被重置爲零,除非您事先明確地執行此操作,並且知道您調用的函數不會修改它,除非出現錯誤。