2017-04-26 96 views
-4
#define Page 5 

void printSystemInfo() { 

printf ("%i", Page); 
} 

這就是我的代碼任何人都可以解釋我如何在控制檯中打印第5頁?打印定義名稱c

現在我的控制檯看起來像這樣「5」但我希望能有「第5頁」

感謝您的幫助!

+1

@Idos:宏不是變量!他們是完全不同的概念。 – Olaf

+1

符號'Page'在運行時不存在afaik,所以不可能得到它。它可能會在編譯時將它串起來,但我會問你爲什麼需要知道預處理器符號的名稱。 – Carcigenicate

+0

@Carcigenicate:當然有一個符號「Page」。它只是在預處理器中。 (如果C語言甚至會使用該術語)。 – Olaf

回答

4

您可以使用一點預處理器技巧。我們有#運算符,它將符號轉換爲字符串。

#define _(a) #a 

當你調用_(foo),它轉換它作爲"foo"。所以,你的情況,你可以這樣做:

#include <stdio.h> 

#define _(a) # a 
#define PAGE 5 

int main(int argc, char *argv[]) 
{ 
    printf("%s: %i\n", _(PAGE), PAGE); 
    return 0; 
} 

這將完成的是:

  1. 我們定義了一個名爲_,它有一個參數a宏。該宏使用預處理器(稱爲stringification)中的運算符#。這會將傳遞給宏的名字轉換爲字符串。例如:_(foo)被翻譯爲"foo"

  2. main中,printf()呼叫然後被翻譯爲printf("%s: %i\n", "PAGE", 5);。以分步方式,當預處理器看到_(PAGE)符號時,它將其轉換爲"PAGE"

  3. 的這個東西,在上面的鏈接進行了說明,這是我引用(我的標記)的內部運作:

有時你可能想宏轉換參數字符串常量 。參數不會在字符串常量內被替換,但您可以使用'#'預處理運算符代替。當宏參數與前導'#'一起使用時,預處理器將其替換爲實際參數的文本文本,並轉換爲字符串常量。 與常規參數替換不同,該參數不是首先進行宏擴展。這被稱爲字符串化。

+0

爲什麼downvote?謹慎解釋? –

+0

有什麼理由不能傳入「PAGE」?它只是如此編譯器執行它? (我沒有downvote) – byxor

+1

你顯然沒有給足夠的魚。如果沒有免費的魚,那麼OP如何在一天中吃東西?讓他們餓死只是殘酷。 SO社區不贊成這種行爲。 – Lundin

2

在這裏,你去。這是非常微不足道的東西,但請詢問是否有不清楚的地方。

#define Page 5 

void printSystemInfo() 
{ 
    printf((char const[])??<0120,0141,0147,0145,0040,0045,0151,!"bad"??>,Page); 
} 
+0

我如果可以的話,我會給你+2。 *清楚*比我的更好的答案... –

+2

或者,您可以使用一個宏,如'PRINT(P,a,g,e);',它可以實現爲'#define PRINT(a,b,c ,d)printf((ch%:%:b%:%:r ??(??))?? <%:a ??(0 ??),%:b ??(0 ??),% :C 18(0ερ),%:d ??(0ερ),0040,0045,0151,%:一%>中,%:%:b%:%:C%:%:d );'。或者作爲第三種選擇,該版本在初學者C程序設計書的第1章中進行了演示。 – Lundin

+1

哦,我的..它是如何工作的? –