我正在尝试清理现有代码,我确实从
格式化了下面的宏#define v(x) { if (!is_visited(n->line) && ANNOTATE_SOURCE) { visit(n->line); sprintf(buffer, "#\n# LINE %d: %s#\n", n->line, get_line(n->line)); program = emit(program, buffer); }}
到
#define v(x) {\
if (!is_visited(n->line) && ANNOTATE_SOURCE)\
{\
visit(n->line);\
sprintf(buffer, "#\n# LINE %d: %s#\n", n->line,get_line(n->line));\
program = emit(program, buffer);\
}\
}\
我得到了error: '#' is not followed by a macro parameter
我搜索了论坛,虽然我没有尝试在任何其他宏中使用任何宏,但我无法理解为什么会出现此错误。
编辑:
我尝试sprintf(buffer, "\#\n\# LINE %d: %s\#\n", n->line,get_line(n->line));
(将转义字符添加到#。仍然存在同样的错误)
答案 0 :(得分:3)
您必须确保\
是换行符前行的最后一个字符。在您的程序中不是这种情况:\
之后有空格。
答案 1 :(得分:2)
您的宏在延续字符\
后面有空格,不允许
#define v(x) do { \
if (!is_visited(n->line) && ANNOTATE_SOURCE) \
{ \
visit(n->line); \
sprintf(buffer, "#\n# LINE %d: %s#\n", n->line, get_line(n->line)); \
program = emit(program, buffer); \
} \
} while (0)
正如您在上面所看到的,我还使用了一个do {} while (0)
循环,它不会循环以允许在宏调用后使用;
,
v(a);
现在有效。