2016-11-22 76 views
0

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

我曾尝试做以下的标题 “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

你在你编写的宏中有一个循环引用:'HIERARCHY_PRINTING'扩展为'PREVIOUS_PRINTING',然后扩展为'HIERARCHY_PRINTING“;''等等等等。也就是说,编译时产生的编译器错误代码有点不同,所以当您简化示例时,翻译可能会丢失一些内容。 –

+0

@HaldeanBrown你得到了什么错误?其实我没有简化任何东西,因为它只是一个实验。 – Link42

+0

如果您发布展示您所问的行为的示例,您将获得更好的帮助!这里是我编译的代码和编译器的输出:http://lpaste.net/345138 –

回答

1

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

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

#define PREVIOUS_PRINTING HIERARCHY_PRINTING ";" 
#define HIERARCHY_PRINTING PREVIOUS_PRINTING 

所以当它会尝试展开的HIERARCHY_PRINTING价值将得到HIERARCHY_PRINTING ";",它因为递归是禁止的。最后编译器会抱怨未声明的HIERARCHY_PRINTING,因为代码中没有这样的声明。