在阅读Programming Pearls
时,我遇到了timemod.c
available here计划。
我不擅长C Macros,所以无法弄清\
在M(op)
定义中的每一行之后的含义。那个有什么用?第一行printf(" %-22s", #op);
是什么意思?
如果你可以指出一些好的来源或啧啧,那么这个答案也是如此。对于C级教授,我们将不胜感激。
答案 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中使用类似函数的宏。事实上你必须要问它的含义是足够的证据。可以通过在其中一个\
转义字符之后添加一个不可见的空格或制表符来打破它,这会让你感到恐惧。