使用 gperf 实现高效的 C/C++ 命令行处理
使用 gperf 实现高效的 C/C++ 命令行处理
GNU 完美(gperf)散列函数生成器简化复杂的输入字符串
文档选项
级别: 中级
Arpan Sen
(arpan@syncad.com
), 技术主管, Synapti Computer Aided Design Pvt Ltd
2007 年 9 月 10 日
GNU 的 gperf 工具是一种 “完美的” 散列函数,可以为用户提供的一组特定字符串生成散列表、散列函数和查找函数的 C/C++ 代码。通过本文学习如何使用 gperf 实现 C/C++ 代码中高效的命令行处理。
命令行处理和 gperf 的作用
命令行处理一直以来都是软件开发中最容易被忽视的领域。几乎所有比较复杂的软件都具有一些可用的命令行选项。事实上,大量 if-else
语句经常被用来处理用户输入,因此维护这种遗留代码相当费时,对资深程序员亦是如此。这种情形下,很多 C 开发人员通常使用冗长(通常都嵌套使用)的 if-else
语句,以及 ANSI C 库函数,例如 strcmp
、strcasecmp
和 strtok
作为补充,如清单 1 所示。
清单 1. C 语言样式的命令行处理
if (strtok(cmdstring, "+dumpdirectory"))
{
// code for printing help messages goes here
}
else if (strtok(cmdstring, "+dumpfile"))
{
// code for printing version info goes here
}
C++ 开发人员并没有使用基于 ANSI C 的应用程序编程接口,而是使用标准模板库(Standard Template Library,STL)中的字符串。尽管如此,仍然无法避免使用嵌套的 if-else
序列语句。很明显,随着命令行选项不断增加,这种方法缺乏可伸缩性。对于具有 N 个选项的典型程序调用,代码最终执行 0(N2
)比较。为了生成运行更加快捷并易于维护的代码,使用散列表存储命令行选项并使用散列验证用户指定的输入,这种方法非常有帮助。
这就是 gperf 扮演的角色。它将从预定的有效命令行选项列表和时间复杂度为 O(1) 的查找函数中生成一个散列表。因此,对于具有 N 个选项的典型程序调用,代码只需执行 O(N) [N*O(1)]
比较 — 这是对遗留代码的巨大改进。
Gperf 使用模式
Gperf 将从用户提供的文件中(通常使用 .gperf 作为扩展名,但不做强制要求)— 例如,commandoptions.gperf — 并针对散列表、散列和查找方法生成 C/C++ 源代码。所有代码被定向到标准输出,然后必须重定向到类似下面的文件:
gperf -L C++ command_line_options.gperf > p
相关文档:
jjhou.csdn.net里面有
--------------------------------------------------------------------------------
在 console mode 中使用 C/C++ 编译器
侯捷 1999.04.08
......
VC2005中C运行时库选择不当导致的链接问题及解决方案
在Microsoft Visual C++ 2005中,如果一个EXE主工程应用程序要使用一个或几个静态LIB库,那么链接时经常会遇到符号重复定义的错误,如果排除库不当又会遇到找不到某些符号的问题,如果强制使用 /force选项链接过去又可能发生一些意想不到的运行时问题。
  ......
2010-04-09
第十五章 输入/输出函数
1、错误报告
perror函数 void perror( char const *message);
2、终止执行
void exit( int status ); 原型定义于stdlib.h
其中status参数返回给操作系统,用于提示程序是否正常完成,这个值和main函数返回的整型状态 ......
简介
对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。
什么是回调函数?
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数 ......