这是我到目前为止拥有的宏:
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4 == 0)), `0', `1')),` ')dnl`0
#endif
')
目的是在_DEBUG
和0
字符之间放置正确数量的制表符,以便它们全部对齐。可能缺少括号或引号,但希望您对我要去的地方有所了解。
我正在使用Xcode,并将选项卡设置为4。这是我为适应此情况所做的更改:
divert(`-1')
# forloop(var, from, to, stmt)
define(`forloop',
`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
define(`_forloop',
`$4`'ifelse($1, `$3', ,
`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
divert`'dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4 > 1), 0, `0', `1')))),` ')0
#endif
')
changecom()dnl
由于我无法在系统上找到“ forloop.m4”,因此将其包含在内。除以4个回合,因此我添加了对余数大于1的检查。我还更改了单个制表符的空格范围。
如果有兴趣,我可以使用此宏定义常量,以用于打开应用程序不同区域的调试。此文件已签入git。然后有一个个人文件,未检入,看起来像这样:
//#define NETWORK_DEBUG 1
在包含上述文件之前,该文件包含在myapp.pch文件中。这样,每个程序员都可以根据需要打开或关闭自己的调试区域。
最简单的缩进方式是使用空格,而不是制表符。尤其是非标准宽度的标签(由于标签的标准宽度为8,因此不能超过此宽度)。
用制表符缩进的第二种最简单的方法是生成一个带空格的文件,并调用unexpand
用制表符替换空格。
话虽如此,您可以在m4中完成此操作,但是您必须更加熟悉它。逐步构建您的表达式:先编写一个,然后再进行下一个。
forloop
不是标准的m4宏。我认为您的意思forloop
是GNU m4手册中介绍的宏。这是GNU m4附带的示例代码(手册对此不太清楚)。要在您的代码中使用它,您需要显式地包括它。发行版本可能会发行也可能不会发行,因此最好将其与代码一起发行。
您的代码中有几个语法问题。
forloop
任何引号之外,因此在评估时define
评估它,而不在debug_macro
评估时评估它。ifelse
宏不选择仅基于第一个参数的值,比较其前两个参数-这是更多的情况下,宏:应将呼叫ifelse(…, 0, 0, 1)
或ifelse(… == 0, 1, 0, 1)
。#
开始评论。M4在评论后会忽略所有内容。定义宏时更改注释定界符debug_macro
。只要参数不太长,下面的代码就可以工作:
include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1'))),` ')0
#endif
')dnl
changecom('#')dnl
使用导致最大循环索引变为0或更小的参数,循环执行约2 32次(m4使用32位模运算)。在这种情况下,您需要进行其他测试。这是当参数过长时插入单个制表符的代码。
include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1')))),` ')0
#endif
')dnl
changecom('#')dnl
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句