Избегайте «предупреждение: объявление UserSuppliedStruct ничего не объявляет» в выходном файле gperf

Учитывая такой файл 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. Должен ли я определить bar :: LookupTableElement в каждом файле gperf (существует более одного gperf, использующего структуру)?
  2. Или использовать что-то вроде (не нашел выключатель, чтобы выключить его в руководстве GCC)?
  3. Uncommment // namespace bar { а также // } // end namespace bar и изменить struct bar::LookupTableElement в struct LookupTableElement, Но таким образом мы перетащим много вещей в пространство имен (взгляните на сгенерированный файл foo.cc, вы бы это знали).
  4. Любая другая идея?

0

Решение

Есть опция для 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).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]