给定这样一个带有用户提供的 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
被删除,将不再有警告。
避免警告的最佳方法是什么?
- 我是否应该在每个 gperf 文件中定义 bar::LookupTableElement(使用该结构的 gperf 不止一个)?
- 或者使用类似的东西(在 GCC 手册中没有找到关闭它的开关)?
- 取消注释
// namespace bar {
并// } // end namespace bar
更改struct bar::LookupTableElement
为struct LookupTableElement
. 但是通过这种方式,我们会将很多东西拖到命名空间中(看看生成的 foo.cc 你就知道了)。 - 还有什么想法吗?