我想以某种自动方式打印标题层次结构。目标是保持头文件包含中的顺序。
我试图在标题“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;
我哪里错了?
答案 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
,因为代码中没有这样的声明。