避免'警告:声明UserSuppliedStruct在gperf输出文件中没有声明任何内容'

时间:2014-03-11 09:52:58

标签: c++ gcc gperf

给出User-supplied struct这样的gperf文件:

%define class-name Table
%define lookup-function-name m

%struct-type
%language=C++

%{
#include <cstring>
#include <cstdio>
// defination of LookupTableElement is put to a header file in the real project and included in
namespace bar {
  struct LookupTableElement {
    const char *name;
    void (*func) ();
  };
}

// a handler
void ack() {
  puts("you said hello");
}

// namespace bar {
%}
struct bar::LookupTableElement;//gperf needs the declaration
%%
######
hello,     ack
######
%%
// } // end namespace bar
int main() {
  auto p = Table::m("hello", sizeof("hello") - 1);
  if (!p) return 1;
  p->func();
  return 0;
}

编译:

$ gperf foo.gperf > foo.cc && g++ -std=c++0x foo.cc

使g ++(gcc 4.7.3和4.8.2测试)警告:

foo.gperf:26:13: warning: declaration ‘struct bar::LookupTableElement’ does not declare anything [enabled by default]
struct bar::LookupTableElement;//declare look up table's element
            ^

如果namespace bar被删除,则不再有警告。

避免警告的最佳方法是什么?

  1. 我应该在每个gperf文件中定义bar :: LookupTableElement(使用struct有多个gperf)?
  2. 或使用类似的东西(在GCC手册中没有找到开关关闭它?)
  3. 取消注册// namespace bar {// } // end namespace bar并将struct bar::LookupTableElement更改为struct LookupTableElement。但是通过这种方式,我们会将大量内容拖入命名空间(看一下你知道的生成的foo.cc)。
  4. 还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

gperf有一个选项:

   -T, --omit-struct-type
          Prevents  the  transfer  of  the type declaration to the output file. Use
          this option if the type is already defined elsewhere.

所以,没有任何命名空间技巧,

struct bar::LookupTableElement;

此选项可生成完全可接受的代码(例如gperf -T foo.gperf > foo.gperf.cpp)。