2017-04-26 99 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

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