在閱讀Programming Pearls
時,我遇到了程序timemod.c
available here。C Preprecessor Usage
我不擅長C宏,所以無法弄清\
在M(op)
的定義中的每一行後的含義。那個有什麼用?第一行printf(" %-22s", #op);
是什麼意思?
隨着這個答案,如果你可以指出一些好的來源或嘖嘖。對於C Prepocessor,將不勝感激。
在閱讀Programming Pearls
時,我遇到了程序timemod.c
available here。C Preprecessor Usage
我不擅長C宏,所以無法弄清\
在M(op)
的定義中的每一行後的含義。那個有什麼用?第一行printf(" %-22s", #op);
是什麼意思?
隨着這個答案,如果你可以指出一些好的來源或嘖嘖。對於C Prepocessor,將不勝感激。
無法弄清楚M(op)定義中每一行後面的含義。那個有什麼用?
反斜槓在行的末端允許宏定義繼續到下一行。否則它會在換行符結束。
又是什麼意思第一行
printf(" %-22s", #op);
?
#
符號是「字符串運算符」;它將宏參數op
變成一個字符串,方法是在其周圍放置雙引號。
除此之外,%-22s
告訴printf
在22個字符中打印左對齊的字符串。
隨着這個答案,如果你可以指向一些好的來源或嘖嘖。對於C Prepocessor,將不勝感激。
學習預處理器「剛好發生」......它是最後一招的工具,所以它的專業知識通常不應該被主動尋找。我已經寫了一個C++ 11/C99預處理器 - 它比聽起來難 - 但我沒有遇到一個很好的教程。
你會給一些使用「stringize operator」'#'的最低工作示例,而不是在預處理器中的任何地方嗎? – kamalbanga
@kamalbanga:「字符串操作符」是一個預處理器操作符,它在預處理器宏定義之外無效。 – Clifford
對於C預處理器的文檔,GNU compiler documentation是非常全面的,但要注意如果你沒有使用GCC,那些被描述爲GNU特定擴展的部分。
C預處理器宏必須在單行上定義,但這會使非常長的宏難以閱讀。 \
是一個轉義字符,它從解析流中刪除下一個字符,因此在這種情況下就好像換行符不在那裏。
一個proprocessor argumnet之前的#接通參數轉換爲一個字符串,所以在格蘭例如:
#define PRINT_INT_EXPR(v) printf("%s = %d", #v, v) ;
鑑於: INT計數器= 5; PRINT_INT_EXPR(counter);
輸出將是:"counter = 5"
,但同樣你可以寫:
PRINT_INT_EXPR(1+2+3+4)
,輸出將是:"1+2+3+4+5 = 15"
。
我建議你引用的例子幾乎不是一個「編程珍珠」(這兩個例子都不是上面的例子),宏的定義是所有關於使用函數的壞和不明智的例子就像C中的宏一樣。事實上,你必須問它的含義是否足夠。可以通過在之後添加單個不可見空間或製表符之後的\
轉義字符之一來打破這一事實,這會讓你驚恐萬分。
編程珍珠是喬恩本特利的一本書。 – kamalbanga
@kamalbanga:我意識到這一點;這是對這本書提倡這種可疑做法的批評。 – Clifford
'\\'是用於在它之後轉義換行的,因此您可以在多行上跨越1行指令。換句話說,如果你逃避換行,那麼下一行仍然是上一行命令的後續行。 – user2485710
你可能想在你進一步學習太多之前,讓自己成爲一本關於C的體面入門書(http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)節目。 –
@PaulR我確實看過Kernighan&Ritchie,但無法清除上面提到的疑問。 – kamalbanga