在宏

时间:2015-07-02 19:54:21

标签: c

我正在尝试清理现有代码,我确实从

格式化了下面的宏
#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));(将转义字符添加到#。仍然存在同样的错误)

2 个答案:

答案 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);

现在有效。