2012-07-26 36 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脚本。