如何让编译器告诉我#define值是什么文件?

时间:2010-06-24 18:26:49

标签: c++ c-preprocessor

我的代码链接到我公司也开发的其他几个库,其中一个库正在重新定义errno.h中的几个值,我希望能够解决这个问题,但是我很难找到确切的问题。正在重新定义这些值的文件,我想知道是否有办法让编译器在文件定义了特定值时告诉我。

6 个答案:

答案 0 :(得分:5)

您可以通过将-include errno.h添加到构建相关库的命令行来实现。这是一个简单的例子。我有一个名为“file.c”的C程序:

#define ESRCH 8

就是这样 - 然后我编译:

cc -c -include errno.h file.c

并且presto,编译器警告:

file.c:1:1: warning: "ESRCH" redefined
In file included from /usr/include/errno.h:23,
                 from <command-line>:0:
/usr/include/sys/errno.h:84:1: warning: this is the location of the previous definition

这会告诉你你的不良定义在哪里。

答案 1 :(得分:3)

您是否尝试使用grep进行搜索?

答案 2 :(得分:2)

如果您不想搜索特定#define的所有标题,可以使用

#undef YOUR_MANIFEST_CONSTANT

在源模块中的每个#include之后,然后从下往上开始删除它们,看看你的定义来自哪里。

此外,您的编译器可能会告诉您已重新定义#define。打开所有警告。

答案 3 :(得分:2)

通过GCC,我做了类似的事情:

g++ input.cc -dD -E > cpp.out

-dD告诉cpp打印定义它们的所有定义。在cpp输出中,还有包含文件名和行号的标记。

答案 4 :(得分:0)

有些环境,我在想IDE,可能会将配置选项绑定到“项目设置”而不是使用配置标头。如果您在许多其他开发人员处于不满意这种行为的地方工作,那么您也可以检查您的工具设置。

大多数编译器会告诉您问题所在,您必须查看并思考诊断通知告诉您的内容。 没错,* nix / Windows上的grep / findstr是你的朋友。 如果没有产生任何结果,请检查构建系统中的工具设置。

答案 5 :(得分:0)

如果右键单击用法并选择“转到定义”,某些IDE将跳转到正确的位置。

如果您真的遇到困难,另一个选项是编译器上的命令行选项。大多数编译器都可以选择在编译C ++代码时输出它们生成的汇编器。 您可以查看此汇编程序(其中包含注释,让您知道C ++源文件中的相对行号)。您不必了解汇编程序,但可以看到在编译器运行时使用了什么值以及包含了哪些文件和定义。检查编译器的文档以了解使用的确切选项