Прежде всего, существуют два типа блоков инициализации :
Этот код должен проиллюстрировать их использование и в каком порядке они выполняются:
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.
Блоки инициализации экземпляра полезны, если вы хотите, чтобы какой-то код запускался независимо от того, какой конструктор используется, или если вы хотите выполнить некоторую инициализацию экземпляра для анонимных классов.
Вы можете взломать источник компилятора 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, чтобы иметь прагмы в сгенерированных заголовках.