Du XiaoGang<>
1,stripcc能干什么: 使用C语言编写的软件为了适应各种不同的平台或要求,大多会使用条件编译,这在提高了软件适应性的同时却降低了代码的可读性,比如说有如下代码片断(摘自stunnel-4.20):
void stunnel_info(int raw) { char line[STRLEN];
sprintf(line, "stunnel " VERSION " on " HOST " with %s", SSLeay_version(SSLEAY_VERSION)); if(raw) log_raw("%s", line); else s_log(LOG_NOTICE, "%s", line);
safecopy(line, "Threading:"); #ifdef USE_UCONTEXT safeconcat(line, "UCONTEXT"); #endif #ifdef USE_PTHREAD safeconcat(line, "PTHREAD"); #endif #ifdef USE_WIN32 safeconcat(line, "WIN32"); #endif #ifdef USE_FORK safeconcat(line, "FORK"); #endif
#ifdef HAVE_OSSL_ENGINE_H safeconcat(line, " SSL:ENGINE"); #endif
safeconcat(line, " Sockets:"); #ifdef USE_POLL safeconcat(line, "POLL"); #else /* defined(USE_POLL) */ safeconcat(line, "SELECT"); #endif /* defined(USE_POLL) */ #if defined(USE_WIN32) && !defined(_WIN32_WCE) if(s_getaddrinfo) safeconcat(line, ",IPv6"); else safeconcat(line, ",IPv4"); #else /* defined(USE_WIN32) */ #if defined(USE_IPv6) safeconcat(line, ",IPv6"); #else /* defined(USE_IPv6) */ safeconcat(line, ",IPv4"); #endif /* defined(USE_IPv6) */ #endif /* defined(USE_WIN32) */
#ifdef USE_LIBWRAP safeconcat(line, " Auth:LIBWRAP"); #endif
if(raw) log_raw("%s", line); else s_log(LOG_NOTICE, "%s", line); }
|
阅读该源码,你认为它的可读性怎样?你是否能很容易的从诸多条件编译分枝中找出对应自己特定平台的部分?下面再附上该代码在linux平台(Fedora Core 3)的实际有效代码(使用stripcc处理得到):
void stunnel_info(int raw) { char line[STRLEN];
sprintf(line, "stunnel " VERSION " on " HOST " with %s", SSLeay_version(SSLEAY_VERSION)); if(raw) log_raw("%s", line); else s_log(LOG_NOTICE, "%s", line);
safecopy(line, "Threading:"); safeconcat(line, "PTHREAD");
safeconcat(line, " SSL:ENGINE");
safeconcat(line, " Sockets:"); safeconcat(line, "POLL"); safeconcat(line, ",IPv4");
safeconcat(line, " Auth:LIBWRAP");
if(raw) log_raw("%s", line); else s_log(LOG_NOTICE, "%s", line); }
|
再次阅读,是不是感觉清楚多了?
其他常见的情况还包括针对不同平台同一函数会有不同实现,这样当你使用ctags或者SourceInSight等工具来分析代码时也很难一下找到真正的
目标,这在linux kernel等支持多平台的源代码中非常多见,比如kernel中arch目录下的代码。
stripcc正是为了解决上述问题,简单的说,
stripcc的用途就是为了提高C源代码的可读性而去除其中未被编译的条件编译分枝,但保留正常的注释以及源码风格。
2,stripcc是怎么工作的: stripcc的工作原理很容易理解:
1,在要处理的代码(比如*.c/*.h)中合适的位置插入gcc扩展的预编译头#warning。
2,进而编译整个项目获取gcc编译输出并进行分析。
3,根据分析结果确定某段代码是否使用,使用则保留,未使用则去除。
这种工作方式相当于手动用#warning来确定某个条件编译分枝(或者整个文件)是否有效,原理上讲是相当可靠的,不会把你的有效代码删除。但
要求你的代码在使用stripcc处理之前必须能使用某种方式调用gcc成功编译。
3,如何使用stripcc:
首先是下载stripcc源码并编译,stripcc使用GPL方式发布,你可以从处下载源码文件,获取源码后解压 、make、make install
完成编译安装。安装目录在/usr/local/bin下,可以选择自己拷贝或者修改Makefile以便放入其他位置,但请确认stripcc所在目录
在你的执行目录$PATH里。
编译安装完成后就是利用stripcc处理你的源文件。
特别提醒,请在处理之前对你的源代码做备份。
执行stripcc -h会列出stripcc的使用方法,主要是各个可选项的含义,如下:
$ stripcc -h
Usage: stripcc
unix-center()提供了诸多Unix实验环境,stripcc的多平台测试从而得以轻松完成。
最后,如果您对stripcc有什么建议或意见,请联系我:dugang@188.com,谢谢!
阅读(1973) | 评论(0) | 转发(0) |