2016-03-24 39 views
2

我會盡可能簡短。 我有一個main.c文件,其中包含幾個頭文件「header1.h」,「header2.h」,...等等。在「main.c」中,使用用戶定義的結構來聲明變量。但是我不知道那個結構的位置(它必須出現在這些頭文件之一或其他頭文件中包含在「main.c」中的那些頭文件之一中)。我的問題是,如果我可以使用「grep」找到該結構的父文件?如果不是「grep」,還有什麼可以做的?我正在使用Ubuntu 14.04。如何在C中查找結構/函數的父頭文件?

+1

'grep -rnw --color。-e「structure_name」' – LPs

+0

您可以使用'IDE',比如'Eclipse',它可以讓您在文件搜索中查找。 – LPs

+3

你真的在問如何在代碼庫中爲類或函數名稱執行文本搜索嗎?這真的已經得到4 upvotes了嗎?發酵的。 –

回答

4

由於預處理程序只是將所有#include d文件到地方,你可以運行,並期待在預處理輸出 - 它留下記號的地方顯示文件界限:

SO1.h

#ifndef SO1_H 
#define SO1_H 
struct Foo {}; 
#endif 

SO2.h

#ifndef SO2_H 
#define SO2_H 
#include "SO1.h" 
#endif 

SO.cpp

#include "SO2.h" 
int main(){} 

既然你是在Ubuntu上,我假設你使用的是gcc(或clang,但它接受相同的選項)。如果你通過了-E標誌,它只能運行在預處理,然後轉儲輸出:

# 1 "SO.cpp" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "SO.cpp" 
# 1 "SO2.h" 1 


# 1 "SO1.h" 1 


struct Foo {}; 
# 4 "SO2.h" 2 
# 2 "SO.cpp" 2 
int main(){} 

我們可以看到,文件標籤立即struct Foo以上是SO1.h,這就是那個struct定義。

這對C和C++同樣適用(雖然我在我的例子中使用了C++)。但是,通常情況下,您應該爲問題選擇一種語言。


如果你知道你struct搜索是在當前項目的地方(即在當前目錄中的某個地方),你的確可以使用基本的命令行工具,如grep。例如

grep -Hn "\<struct Foo\>" *.{h,c,cpp} 

會告訴你文件和一行匹配的源代碼文件。我經常在~/bin/srcgrep使用一個小腳本我把:

#!/bin/bash 
RE="$1" 
shift 1 
find [email protected] \(-name "*.h" -o -name "*.hpp" -o -name "*.cpp" -o -name "*.c" \) -exec grep263 -EHn --colour=always "$RE" {} \; 

然後

srcgrep "\<struct Foo\>" dir1 dir2 

將搜索所有源代碼文件的任何地方(包括子目錄)dir1dir2下。

更高級的工具是ack!