820просмотров
13 марта 2025 г.
Score: 902
Такие себе инженерные решения Копаясь в LLVM, нашёл в clang/doc/LibTooling.rst строку в глобальном scope:
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
И это выглядит очень странно: как-то неявно связанное с... Чем-то глобальным. Так оно в целом и есть. Посмотрим на сам класс:
struct extrahelp { StringRef morehelp; explicit extrahelp(StringRef help);
}; extrahelp::extrahelp(StringRef Help) : morehelp(Help) { GlobalParser->MoreHelp.push_back(Help);
}
То есть фактически здесь сделан вызов до main с помощью конструктора глобального объекта. Но здесь мы используем какой-то другой глобальный объект... А началась ли его жизнь? И здесь ещё один трюк:
static ManagedStatic<CommandLineParser> GlobalParser;
А ManagedStatic — это класс с перегрузкой operator*/operator->, которые лениво создают этот объект. Забавно. #compiler #llvm