打印标题层次结构

时间:2016-11-22 16:21:22

标签: c

我想以某种自动方式打印标题层次结构。目标是保持头文件包含中的顺序。

我试图在标题“tmp1.h”中执行以下操作:

#ifndef HIERARCHY_PRINTING
#define HIERARCHY_PRINTING "start: "
#endif 

#undef PREVIOUS_PRINTING
#define PREVIOUS_PRINTING HIERARCHY_PRINTING "->"
#undef HIERARCHY_PRINTING
#define HIERARCHY_PRINTING PREVIOUS_PRINTING "tmp1.h"

#ifndef _TMP1_
#define _TMP1_

// Some stuff

#endif

#undef PREVIOUS_PRINTING
#define PREVIOUS_PRINTING HIERARCHY_PRINTING ";"
#undef HIERARCHY_PRINTING
#define HIERARCHY_PRINTING PREVIOUS_PRINTING

在“tmp.c”中:

#include <stdio.h>
#include "tmp1.h"

const char *str = HIERARCHY_PRINTING;

int main() {
    printf("Headers hierarchy:\n");
    printf("%s\n", str);

    return 0;
}

但是这不能编译:

tmp.c:7:19: error: ‘HIERARCHY_PRINTING’ undeclared here (not in a function)
tmp.c:7:19: error: expected ‘,’ or ‘;’ before string constant

我希望看到类似的内容:

start: ->tmp1.h;

我哪里错了?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你试图在PREVIOUS_PRINTING宏定义中保存一些中间结果,该定义应该存储宏HIERARCHY_PRINTING的内容,以便稍后使用HIERARCHY_PRINTING未定义。

但是这种方法并不起作用,因为预处理器在需要之前不会展开定义。并且#undef命令只会抛弃之前定义的内容。因此,对于预处理器完成头文件处理的示例,它将具有以下内容:

#define PREVIOUS_PRINTING HIERARCHY_PRINTING ";"
#define HIERARCHY_PRINTING PREVIOUS_PRINTING

因此,当它试图展开HIERARCHY_PRINTING的值时,它将获得HIERARCHY_PRINTING ";"并且因为递归是被禁止的。最后编译器会抱怨未声明的HIERARCHY_PRINTING,因为代码中没有这样的声明。