2

我目前正在编写一个小型 bash 脚本,该脚本读取源 C 文件,然后找到相应的包含文件。

现在我必须在两种查找映射 M 的模型之间进行选择:文件名 -> {包含文件路径}。我有两个数组 - 一个包含找到的包含文件名,另一个包含可能的路径。选项是:

a) 在一个路径中查找每个文件,然后继续到另一个路径;

b) 查看路径列表以找到一个文件,然后继续查找另一个文件。

我的问题是 - 什么会更快?每个选项的迭代次数相同,但也许某些命令更耗时?我个人更喜欢选项a)。

感谢您的帮助,如果这是一个愚蠢的问题,我们深表歉意。

4

3 回答 3

1

你应该做什么取决于你的目标,我不太明白。make如果您正在创建文件,您可能应该使用 makedepend,如前面的答案中所述。

相反,如果您想了解系统上是否有多个版本的头文件,请考虑使用该locate命令。例如,在我的 ubuntu 12.04 linux 系统上,以下命令大约需要一秒钟才能完成,并产生命令下方所示的输出。

  $ locate stdio.h | grep usr/include
  /usr/include/stdio.h
  /usr/include/c++/4.6/tr1/stdio.h
  /usr/include/glib-2.0/glib/gstdio.h
  /usr/include/sharutils/stdio.h
  /usr/include/x86_64-linux-gnu/bits/stdio.h

如果您在文件 pqr 的单独行上有一个库路径列表,并且在文件 xyz 中有一个头文件列表,则可以使用类似的命令

  locate / | grep -f xyz | grep -f pqr

(注意,如果您愿意,-F可以与-fstdio.hstdlib.hxyz/usr/include//usr/lib/pqr

  /usr/include/stdio.h
  /usr/include/stdlib.h
  /usr/include/c++/4.6/tr1/stdio.h
  /usr/include/c++/4.6/tr1/stdlib.h
  /usr/include/freetype2/freetype/config/ftstdlib.h
  /usr/include/glib-2.0/glib/gstdio.h
  /usr/include/sharutils/stdio.h
  /usr/include/sharutils/stdlib.h
  /usr/include/x86_64-linux-gnu/bits/stdio.h
  /usr/include/x86_64-linux-gnu/bits/stdlib.h
  /usr/lib/perl/5.14.2/CORE/nostdio.h
  /usr/lib/syslinux/com32/include/stdio.h
  /usr/lib/syslinux/com32/include/stdlib.h

注意,在典型的 linux 系统上,文件名数据库每天更新一次。在查找系统头文件时,这可能不会成为问题。对于更短暂的文件,您可能需要sudo updatedb在使用之前说一下locate,这会使总时间增加几秒钟到几分钟。

于 2012-10-14T00:02:48.753 回答
1

仅当您编码错误时才会有相同数量的迭代,continue一旦找到匹配项就不要使用关键字(不要忘记它也可以将数字作为参数来影响外部循环)。

我将遍历所有包含文件并按一些顺序查看路径 -<system>包含应该首先搜索系统包含路径以获得更快的结果,而包含也是如此"local"。在解析时丢弃这些信息是不明智的。

find -type f但是,我认为您可以通过在所有包含路径上运行并将结果存储在临时文件或变量中来做得更好。然后,您只需grep(或任何等价物)将其用于包含本身。这样可以节省一些 I/O,因为其中一半是一次性读取的,而且只读取一次。

于 2012-10-13T22:16:28.033 回答
0

要查找您的包含文件,专用的解决方案是makedepend,尤其是在您使用 makefile 的情况下。

于 2012-10-13T22:27:41.443 回答