2014-05-03 55 views
0

在閱讀Programming Pearls時,我遇到了程序timemod.cavailable hereC Preprecessor Usage

我不擅長C宏,所以無法弄清\M(op)的定義中的每一行後的含義。那個有什麼用?第一行printf(" %-22s", #op);是什麼意思?

隨着這個答案,如果你可以指出一些好的來源或嘖嘖。對於C Prepocessor,將不勝感激。

+1

'\\'是用於在它之後轉義換行的,因此您可以在多行上跨越1行指令。換句話說,如果你逃避換行,那麼下一行仍然是上一行命令的後續行。 – user2485710

+2

你可能想在你進一步學習太多之前,讓自己成爲一本關於C的體面入門書(http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)節目。 –

+0

@PaulR我確實看過Kernighan&Ritchie,但無法清除上面提到的疑問。 – kamalbanga

回答

4

無法弄清楚M(op)定義中每一行後面的含義。那個有什麼用?

反斜槓在行的末端允許宏定義繼續到下一行。否則它會在換行符結束。

又是什麼意思第一行printf(" %-22s", #op);

#符號是「字符串運算符」;它將宏參數op變成一個字符串,方法是在其周圍放置雙引號。

除此之外,%-22s告訴printf在22個字符中打印左對齊的字符串。

隨着這個答案,如果你可以指向一些好的來源或嘖嘖。對於C Prepocessor,將不勝感激。

學習預處理器「剛好發生」......它是最後一招的工具,所以它的專業知識通常不應該被主動尋找。我已經寫了一個C++ 11/C99預處理器 - 它比聽起來難 - 但我沒有遇到一個很好的教程。

+0

你會給一些使用「stringize operator」'#'的最低工作示例,而不是在預處理器中的任何地方嗎? – kamalbanga

+1

@kamalbanga:「字符串操作符」是一個預處理器操作符,它在預處理器宏定義之外無效。 – Clifford

2

對於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中的宏一樣。事實上,你必須問它的含義是否足夠。可以通過在之後添加單個不可見空間或製表符之後的\轉義字符之一來打破這一事實,這會讓你驚恐萬分。

+0

編程珍珠是喬恩本特利的一本書。 – kamalbanga

+0

@kamalbanga:我意識到這一點;這是對這本書提倡這種可疑做法的批評。 – Clifford