gpt4 book ai didi

c++ - 避免 gperf 输出文件中的 'warning: declaration UserSuppliedStruct does not declare anything'

转载 作者:行者123 更新时间:2023-11-28 07:01:51 26 4
gpt4 key购买 nike

给定这样一个带有 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(有多个 gperf 使用该结构)?
  2. 或者使用类似的东西(在 GCC 手册中没有找到关闭它的开关)?
  3. 取消注释 //namespace bar {//}//end namespace bar 并将 struct bar::LookupTableElement 更改为 结构 LookupTableElement。但是通过这种方式,我们会将很多东西拖到命名空间中(看看生成的 foo.cc 你就知道了)。
  4. 还有其他想法吗?

最佳答案

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.

所以,没有任何 namespace 技巧,

struct bar::LookupTableElement;

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

关于c++ - 避免 gperf 输出文件中的 'warning: declaration UserSuppliedStruct does not declare anything',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22322100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com