2012-07-26 54 views
0
std::string systemStr = "C:\\gcc1\\gccxml.exe "; 
    systemStr += "\"" ; 
    systemStr += argv[1] ; 
    std::cout<<"Header File is:"<<argv[1]<<endl; 

在上面的代碼片段中,argv [1]表示頭文件的名稱。我想打開這個頭文件並搜索可能存在的#ifdefs。我如何去做這件事?問題是argv [1]是一個字符串。如果我不清楚,我很抱歉。在頭文件中搜索#ifdef

+0

對不起,argv在main()中是這樣定義的:bool main(int argc,char * argv []) – Retry 2012-07-26 22:46:59

+1

像其他文件一樣閱讀。 – chris 2012-07-26 22:48:08

回答

1

如何這樣的事情...

std::cout<<"Header File is:"<<argv[1]<<endl; 

std::ifstream file(argv[1]); 
int lineNum = 0; 
bool hasIfdef = false; 

while(file.good()) 
{ 
    std::string line; 
    std::getline(file, line); 
    lineNum++; 

    if(line.find("#ifdef") != std::string::npos || 
     line.find("#ifndef") != std::string::npos) 
    { 
     std::cout << "Line " << lineNum << ": " << line << std::endl; 
     hasIfdef = true; 
    } 
} 
+0

請注意,這不會解析您的頭文件...因此,如果'#ifdef'出現在字符串中,或​​者該行在註釋塊中,或者它仍然會被拾取。 – paddy 2012-07-26 22:59:05

+0

我剛剛寫下了一段類似的代碼。不管怎樣,謝謝你! – Retry 2012-07-26 23:05:54

+0

你也應該認識到'#'和'ifdef'之間可以有空格(雖然不是換行符)。 – 2012-07-27 00:33:36

1

要做到這一點,最簡單的方法是使用shell腳本:

 cat header.h | grep -n "^[:space:]*#[:space:]*if[n]*def" 

這將顯示行數#ifdef和或的#ifndef 。

如果您需要在C程序中執行此操作,您可以始終執行shell腳本。