Linux 查找所有文件中是否直接或间接存在字符串

Linux 查找所有文件中是否直接或间接存在字符串,linux,shell,unix,Linux,Shell,Unix,我有一组c文件,我需要找出一个特定的头文件是否直接或间接存在于所有文件中 For ex:- Header files:- hf1.h:- int i = 10; hf2.h:- #include "hf1.h" hf3.h:- #include <hf1.h> hf4.h:- #include <hf3.h> c files:- cf1.c:- #include <hf1.h> cf2.c:- #include <hf2.h> cf3

我有一组c文件,我需要找出一个特定的头文件是否直接或间接存在于所有文件中

For ex:-
Header files:-

hf1.h:-
int i = 10;

hf2.h:-
#include "hf1.h"

hf3.h:-
#include <hf1.h>

hf4.h:-
#include <hf3.h>

c files:-
cf1.c:-
#include <hf1.h>

cf2.c:-
#include <hf2.h>

cf3.c:-
#include <hf4.h>
对于ex:-
头文件:-
hf1.h:-
int i=10;
hf2.h:-
#包括“hf1.h”
hf3.h:-
#包括
hf4.h:-
#包括
c文件:-
cf1.c:-
#包括
cf2.c:-
#包括
cf3.c:-
#包括
在本例中,hf4.h间接包含hf1.h文件。我需要确定hf1.h是否直接或间接包含在所有文件中。如果有人需要更多的澄清,请告诉我


任何unix命令或shell脚本都可以解决此问题。

很长的一段路是在gcc中对所有c文件使用-E选项(使用此参数,它实际上只在预处理后提供输出,不进行编译),然后在所有输出中搜索每个头文件的部分。
如果想到任何较短的方法,将进行更新。

一个很长的方法是在gcc中对所有c文件使用-E选项(使用此参数,它实际上只在预处理后提供输出,不进行编译),然后在所有输出中搜索每个头文件的部分。
如果想到任何较短的方法,将进行更新。

假设您没有类似

#include               <hf1.h>
#include \
<hf1.h>
指挥部。为了找到间接包含,我建议您

#error "hf1_included"

并编译所有文件(例如“make-k”或类似文件)。捕获stderr并搜索包含的hf1_。这将给出直接或间接包含hf1.h的文件列表。现在,您可以通过考虑第一个仅包含直接包含的列表来提取仅包含间接包含的列表。您可以使用程序
comm
来执行此操作。

假设您没有类似的代码案例

#include               <hf1.h>
#include \
<hf1.h>
指挥部。为了找到间接包含,我建议您

#error "hf1_included"
并编译所有文件(例如“make-k”或类似文件)。捕获stderr并搜索包含的hf1_。这将给出直接或间接包含hf1.h的文件列表。现在,您可以通过考虑第一个仅包含直接包含的列表来提取仅包含间接包含的列表。您可以使用程序
comm
执行此操作

  • 在hf1.h中引入#error指令
  • makeclean
  • make-k all
  • 现在存在的所有对象文件都未包含hf1.h
  • -k
    步骤是关键的一步:它确保编译在第一个损坏的文件之后继续进行

  • 在hf1.h中引入#error指令
  • makeclean
  • make-k all
  • 现在存在的所有对象文件都未包含hf1.h

  • -k
    步骤是关键的一步:它确保编译在第一个断开的文件之后继续进行。

    我认为您可以重命名头文件并编译源文件。它将向您列出使用它作为错误消息的文件列表。只需grep并应用排序并列出唯一的files@John这种方法的问题是,一旦编译器在一个文件中发现这个错误,编译就会终止.sok。然后在头文件中添加一个命名奇怪的变量声明,并对其进行预处理(在gcc中使用-E选项),然后grep给定的奇怪名称。我想grep可以单独列出文件名。我想你可以重命名头文件并编译源文件。它将向您列出使用它作为错误消息的文件列表。只需grep并应用排序并列出唯一的files@John这种方法的问题是,一旦编译器在一个文件中发现这个错误,编译就会终止.sok。然后在头文件中添加一个命名奇怪的变量声明,并对其进行预处理(在gcc中使用-E选项),然后grep给定的奇怪名称。我想grep可以选择单独列出文件名。