CLANG: Как получить значение init статического члена данных в классе - PullRequest
0 голосов
/ 22 февраля 2019

Дан класс со статическим constexpr для const char *:

struct S {static constexpr const char * str = "123";...};

Разбирая его в Clang AST, смогу ли я получить строку expr "123" из класса FieldDecl через GetInClassInitializer ()?Я думаю, что я получу какой-то указатель, но будет ли это указывать на некоторую область с «123»?Если нет, то какой должен быть правильный вызов clang API, чтобы получить значение?Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Я думаю, что слишком много думал для использования "const" в элементе данных def.Я был обеспокоен тем, что строка «123» может быть недоступна во время разбора.Оказывается, это доступно, и доступ довольно прост.Предположим, что «d» указывает на член определения «str» выше, фрагмент функции для возврата инициализированной строки может выглядеть следующим образом:

...
if ( VarDecl *vard = dyn_cast<VarDecl>(d) ) {
   if ( vard->isStaticDataMember() ) {
       Expr *expr = vard->getInit();
       Expr *constExpr = expr->IgnoreImpCasts();
       if ( StringLiteral *str = dyn_cast<StringLiteral>(constExpr) )
          return str->getString().str();
   }
}
...