上面生成的gccxml.exe就是我们用来解析源码文件的工具,当然这玩意不能单独使用,他只是一个补丁,他得依附在编译器上,所以你得保证你的电脑上安装了编译器。下面是GCCXML支持的几个编译器(有点奇怪的是我电脑上其实只有vs2010,但也成功了,虽然下面没有列出来后来经过测试发现确实用的是08的,可能之前没有卸载干净,可以通过get_gccxml_compiler
()来获取当前的版本):
· GCC: Versions 4.2,4.1, 4.0, 3.4, 3.3, 3.2, 2.95.x
· VisualC++: Versions 8, 7.1, 7.0, and 6 (sp5)
· Borland,Intel, SGI: formerly supported but no longer tested
他的命令行格式是这样的:gccxml[options]
具体的选项可以参考http://gccxml.github.io/HTML/Running.html,这里我只用了最简单的格式。
这里用来测试的文件是取自SWMM引擎的hash.c代码如下:
//-----------------------------------------------------------------------------
// hash.c
//
// Implementation of a simple Hash Table for string storage & retrieval
// CASE INSENSITIVE
//
// Written by L. Rossman
// Last Updated on 6/19/03
//
// The hash table data structure (HTable) is defined in "hash.h".
// Interface Functions:
// HTcreate() - creates a hash table
// HTinsert() - inserts a string & its index value into a hash table
// HTfind() - retrieves the index value of a string from a table
// HTfree() - frees a hash table
//-----------------------------------------------------------------------------
#include
#include
#include "hash.h"
#define UCHAR(x) (((x) >= 'a' && (x) <= 'z') ? ((x)&~32) : (x))
/* Case-insensitive comparison of strings s1 and s2 */
int samestr(char *s1, char *s2)
{
int i;
for (i=0; UCHAR(s1[i]) == UCHAR(s2[i]); i++)
if (!s1[i+1] && !s2[i+1]) return(1);
return(0);
} /* End of samestr */
/* Use Fletcher's checksum to compute 2-byte hash of string */
unsigned int hash(char *str)
{
unsigned int sum1= 0, check1;
unsigned long sum2= 0L;
while( '\0' != *str )
{
sum1 += UCHAR(*str);
str++;
if ( 255 <= sum1 ) sum1 -= 255;
sum2 += sum1;
}
check1= sum2;
check1 %= 255;
check1= 255 - (sum1+check1) % 255;
sum1= 255 - (sum1+check1) % 255;
return( ( ( check1 << 8 ) | sum1 ) % HTMAXSIZE);
}
HTtable *HTcreate()
{
int i;
HTtable *ht = (HTtable *) calloc(HTMAXSIZE, sizeof(HTtable));
if (ht != NULL) for (i=0; i= HTMAXSIZE ) return(0);
entry = (struct HTentry *) malloc(sizeof(struct HTentry));
if (entry == NULL) return(0);
entry->key = key;
entry->data = data;
entry->next = ht[i];
ht[i] = entry;
return(1);
}
int HTfind(HTtable *ht, char *key)
{
unsigned int i = hash(key);
struct HTentry *entry;
if ( i >= HTMAXSIZE ) return(NOTFOUND);
entry = ht[i];
while (entry != NULL)
{
if ( samestr(entry->key,key) ) return(entry->data);
entry = entry->next;
}
return(NOTFOUND);
}
char *HTfindKey(HTtable *ht, char *key)
{
unsigned int i = hash(key);
struct HTentry *entry;
if ( i >= HTMAXSIZE ) return(NULL);
entry = ht[i];
while (entry != NULL)
{
if ( samestr(entry->key,key) ) return(entry->key);
entry = entry->next;
}
return(NULL);
}
void HTfree(HTtable *ht)
{
struct HTentry *entry,
*nextentry;
int i;
for (i=0; inext;
free(entry);
entry = nextentry;
}
}
free(ht);
}
当然你要保证你的代码和文件路径(这里的文件路径包含引用的头文件)是没有问题的,不然编译器会检测出问题,而导致失败。
然后通过执行
就可以看到在D盘下生成了hash.xml文件。具体文件如下:
我们可以看到基本上源码中的信息都可以在XML文件中找到,当然按照需求我们还得对xml文件中的信息进行提取。这就是另一个牛逼的工具pygccxml干的事情了,事实上这个工具也包含了gccxml的功能,而且更强大些。