Google protobuf не может быть скомпилирован из-за плохого кода (генерирует предупреждения) [duplicate]

Прежде всего, существуют два типа блоков инициализации :

  • блоков инициализации экземпляра и
  • блоков статической инициализации.

Этот код должен проиллюстрировать их использование и в каком порядке они выполняются:

public class Test {

    static int staticVariable;
    int nonStaticVariable;        

    // Static initialization block:
    // Runs once (when the class is initialized)
    static {
        System.out.println("Static initalization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    // Runs each time you instantiate an object
    {
        System.out.println("Instance initialization.");
        nonStaticVariable = 7;
    }

    public Test() {
        System.out.println("Constructor.");
    }

    public static void main(String[] args) {
        new Test();
        new Test();
    }
}

Отпечатки:

Static initalization.
Instance initialization.
Constructor.
Instance initialization.
Constructor.

Блоки инициализации экземпляра полезны, если вы хотите, чтобы какой-то код запускался независимо от того, какой конструктор используется, или если вы хотите выполнить некоторую инициализацию экземпляра для анонимных классов.

12
задан Gang Yin 20 February 2013 в 05:25
поделиться

1 ответ

Вы можете взломать источник компилятора protoc, чтобы он автоматически вставлял прагмы в сгенерированные файлы.

В src / google / protobuf / compiler / cpp / cpp_file.cc в GenerateHeader(io::Printer* printer) вокруг линии 94, измените первый вызов printer->Print на:

  // Generate top of header.
  printer->Print(
    "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
    "// source: $filename$\n"
    "\n"
    "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n"
    "#define PROTOBUF_$filename_identifier$__INCLUDED\n"
    "\n"
    "#ifdef _MSC_VER\n"
    "#  pragma warning(push)\n"
    "#  pragma warning(disable: 4127 4244 4267)\n"
    "#endif\n"
    "\n"
    "#include <string>\n"
    "\n",
    "filename", file_->name(),
    "filename_identifier", filename_identifier);

. Затем в конце появится такая же функция по строке 294 , измените последний printer->Print вызов:

  printer->Print(
    "#ifdef _MSC_VER\n"
    "#  pragma warning(pop)\n"
    "#endif\n"
    "\n"
    "#endif  // PROTOBUF_$filename_identifier$__INCLUDED\n",
    "filename_identifier", filename_identifier);

Теперь вам просто нужно скомпилировать цель protoc и запустить новый protoc.exe, чтобы иметь прагмы в сгенерированных заголовках.

8
ответ дан Fraser 25 August 2018 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: