使用gperf时遇到问题:不允许使用空输入关键字

时间:2011-03-16 06:43:40

标签: c++ open-source gperf

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

只得到:

  

不允许使用空输入关键字。至   识别一个空的输入关键字,你的   代码应该检查len == 0之前   调用gperf生成的查找   功能

版本:GNU gperf 3.0.1 为什么呢?

3 个答案:

答案 0 :(得分: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."

-charlie

答案 1 :(得分:1)

我发现gperf不喜欢关键字部分中的空行。我认为它将空行视为空字符串,因为它不是注释,并且抱怨它是“空”并且len = 0。因为我习惯总是用一个空行结束一个文件(有些装配工和编译器都没有它),这总是会有问题!

答案 2 :(得分:0)

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