【问题标题】:identify the exact header file识别准确的头文件
【发布时间】:2009-10-21 14:00:18
【问题描述】:

我在源文件 (*.c) 中使用了一些宏。

在编译过程中或从库中是否有任何方法可以确定解析此特定宏的确切头文件?

问题是我们在某些头文件中使用了一个宏 #defined to 10 ,但在代码中接收到的值是 4 。因此,我们不想去检查所有的 dep 文件,而是想知道是否有一些直接的方法来识别宏被解析的来源。

【问题讨论】:

  • 为什么不运行一个简单的搜索或 grep?

标签: c++ c unix ksh


【解决方案1】:

如果您只是在文件上运行 cpp(C 预处理器),输出将包含格式为 #line 的指令

#line 45 "silly-file-with-macros.h"

让编译器说出一切的来源。所以一种方法是使用

 cpp my-file.c | more

并查找#line 指令。

根据您的编译器,您可以使用的另一个技巧是将宏重新定义为其他内容,编译器会发出类似的警告

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(来自 gcc)它应该告诉您宏之前定义的位置。但是想一想,你怎么还没有收到这个警告呢?

另一个想法是使用makedepend 获取所有包含文件的列表,然后用grep 查找其中的#define 行。

【讨论】:

  • 答案第一部分的问题是预处理文件会删除所有#define 指令和所有使用MACRONAME 的实例(这就是预处理器所做的),所以什么都没有了grep 为。但是技巧 #2 非常有效。
  • 你是对的,宏将消失。我应该先测试一下!
【解决方案2】:

#define 的 grep?

【讨论】:

  • 这个问题是什么文件要grep。如果使用“makedepend”可以获得完整的依赖项列表,然后将其作为参数提供给 grep。
  • 项目中的所有文件。如果它不存在,那么你就是在重新定义你一开始就不应该接触的东西。
  • 这不是问题所在吗?追踪一些不应该被重新定义的东西?
【解决方案3】:
find / -name '*.h' | xargs -L 100 grep -H macroname

那里有三个命令。 find 命令选择要搜索的文件,以便您可以将其更改为 '.c' 或 '.cpp' 或任何您需要的文件。然后 xargs 命令一次将文件列表拆分为 100 个,这样您就不会溢出某些内部 shell 命令缓冲区大小。然后 grep 命令对每个包含 100 个文件的列表重复运行,并打印包含宏名的所有文件名和使用它的代码行。

从这里你应该能够看到它在哪里被重新定义。

【讨论】:

  • 这没有任何意义,因为您正在搜索可能不包含在文件中的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2020-03-10
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多