C预处理器用法

时间:2014-05-03 08:10:58

标签: c macros

在阅读Programming Pearls时,我遇到了timemod.c available here计划。

我不擅长C Macros,所以无法弄清\M(op)定义中的每一行之后的含义。那个有什么用?第一行printf(" %-22s", #op);是什么意思?

如果你可以指出一些好的来源或啧啧,那么这个答案也是如此。对于C级教授,我们将不胜感激。

2 个答案:

答案 0 :(得分:4)

  

无法弄清楚M(op)定义中每行后的\意味着什么。这是为了什么?

该行(非常)末尾的反斜杠允许宏定义继续到下一行。否则它将以换行结束。

  

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

#符号是" stringize运算符&#34 ;;它通过在它周围放置双引号将宏参数op转换为字符串文字。

除此之外,%-22s告诉printf以22个字符打印左对齐的字符串。

  

如果你可以指出一些好的来源或啧啧,那么这个答案也是如此。对于C级教授,我们将不胜感激。

学习预处理器"刚刚发生" ...它是最后的工具,因此通常不应该积极寻求专业知识。我编写了一个C ++ 11 / C99预处理器 - 它比听起来更难 - 但我没有遇到过一个好的教程。

答案 1 :(得分:2)

对于C预处理器的文档,GNU compiler documentation非常全面,但如果您不使用GCC,请注意那些描述为GNU特定扩展的部分。

必须在单行上定义C预处理器宏,但这会使很长的宏难以读取。 \是一个转义字符,它从解析流中删除下一个字符,因此在这种情况下就好像换行符不在那里。

预处理器argumnet之前的#将参数转换为字符串,所以在例如:

#define PRINT_INT_EXPR( v ) printf( "%s = %d", #v, v ) ;  

给定:     int counter = 5;     PRINT_INT_EXPR(计数器);

输出结果为:"counter = 5",但同样可以写:

PRINT_INT_EXPR( 1+2+3+4 )

,输出结果为:"1+2+3+4+5 = 15"

我建议你引用的例子不是“编程珍珠”(以上都不是我的例子),宏M(op)的定义就是一个很糟糕和不明智的例子。关于在C中使用类似函数的宏。事实上你必须要问它的含义是足够的证据。可以通过在其中一个\转义字符之后添加一个不可见的空格或制表符来打破它,这会让你感到恐惧。