0

command_options.gperf:

%{
#include "command_options.h"
typedef struct CommandOptionCode CommandOptionCode;
%}
struct CommandOption
  {
  const char *Option;
  int OptionCode;
  };
%%
+helpverbose, CommandOptionCode::HELPVERBOSE
+password, CommandOptionCode::PASSWORD
+nocopyright, CommandOptionCode::NOCOPYRIGHT
+nolog, CommandOptionCode::NOLOG
+_64bit, CommandOptionCode::_64BIT

command_options.h:

#ifndef __COMMANDOPTIONS_H
#define __COMMANDOPTIONS_H
struct CommandOptionCode 
  {
  enum 
    {
    HELPVERBOSE = 1,
    PASSWORD = 2,
    NOCOPYRIGHT = 3,
    NOLOG = 4,
    _64BIT = 5
    };
  };
#endif

当我运行时:

gperf  -L C++ -t --output-file=perfecthash.hpp command_options.gperf

只得到:

不允许空输入关键字。要识别空输入关键字,您的代码应在调用 gperf 生成的查找函数之前检查 len == 0。

版本:GNU gperf 3.0.1 为什么?

4

3 回答 3

1

我发现 gperf 2.7 并不关心第一部分和关键字之间是否有 '%%' 分隔符。3.0.1 严格执行这一点。因此,就我而言,我进行了修改:

%{
#include <string.h>
%}

scan

成为

%{
#include <string.h>
%}
%%

scan

我相信,您的情况有所不同,因为手册指出结构的第一个字段必须称为“名称”:

"This first field must be called `name', although it is possible to modify its name with the `-K' option (or, equivalently, the `%define slot-name' declaration) described below."

-查理

于 2011-04-19T20:45:50.007 回答
1

我发现 gperf 不喜欢关键字部分的空行。我猜它将空行视为空字符串,因为它不是注释,并抱怨它是“空的”并且len = 0。由于我习惯于总是以空行结束文件(有些汇编程序和编译器不愿意没有它),所以这总是一个问题!

于 2011-10-26T09:28:15.883 回答
0

除了 Richard 提到的空行问题外,gperf 也不喜欢某些标记前的空格。(我剪切并粘贴了一个简单的 gperf 示例,该示例在用户输入中查找“粗鲁”字词。示例的名称是 rude-1.gperf。示例有一些缩进触发了同样的错误。)

于 2013-08-14T08:09:55.457 回答