#define Page 5
void printSystemInfo() {
printf ("%i", Page);
}
這就是我的代碼任何人都可以解釋我如何在控制檯中打印第5頁?打印定義名稱c
現在我的控制檯看起來像這樣「5」但我希望能有「第5頁」
感謝您的幫助!
#define Page 5
void printSystemInfo() {
printf ("%i", Page);
}
這就是我的代碼任何人都可以解釋我如何在控制檯中打印第5頁?打印定義名稱c
現在我的控制檯看起來像這樣「5」但我希望能有「第5頁」
感謝您的幫助!
您可以使用一點預處理器技巧。我們有#
運算符,它將符號轉換爲字符串。
#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;
}
這將完成的是:
我們定義了一個名爲_
,它有一個參數a
宏。該宏使用預處理器(稱爲stringification)中的運算符#
。這會將傳遞給宏的名字轉換爲字符串。例如:_(foo)
被翻譯爲"foo"
。
在main
中,printf()
呼叫然後被翻譯爲printf("%s: %i\n", "PAGE", 5);
。以分步方式,當預處理器看到_(PAGE)
符號時,它將其轉換爲"PAGE"
。
的這個東西,在上面的鏈接進行了說明,這是我引用(我的標記)的內部運作:
有時你可能想宏轉換參數字符串常量 。參數不會在字符串常量內被替換,但您可以使用'#'預處理運算符代替。當宏參數與前導'#'一起使用時,預處理器將其替換爲實際參數的文本文本,並轉換爲字符串常量。 與常規參數替換不同,該參數不是首先進行宏擴展。這被稱爲字符串化。
在這裏,你去。這是非常微不足道的東西,但請詢問是否有不清楚的地方。
#define Page 5
void printSystemInfo()
{
printf((char const[])??<0120,0141,0147,0145,0040,0045,0151,!"bad"??>,Page);
}
我如果可以的話,我會給你+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
哦,我的..它是如何工作的? –
@Idos:宏不是變量!他們是完全不同的概念。 – Olaf
符號'Page'在運行時不存在afaik,所以不可能得到它。它可能會在編譯時將它串起來,但我會問你爲什麼需要知道預處理器符號的名稱。 – Carcigenicate
@Carcigenicate:當然有一個符號「Page」。它只是在預處理器中。 (如果C語言甚至會使用該術語)。 – Olaf