Как получить полный тип в виде строки с информацией о пространстве имен (если есть) из Decl/ParmDecl

Я пытаюсь извлечь все сигнатуры функций, по сути, полный тип параметров, с пространством имен из источника c/cpp. Цель состоит в том, чтобы создать файл, в котором я могу объявить переменную того же типа, не открывая пространство имен, в котором они находятся, и иметь возможность успешно скомпилировать этот файл.

У меня есть объекты типа* из ParamVarDecl* с использованием RecursiveASTVisitor. В очень простых случаях я могу получить тип в виде строки, и это нормально, но в данном случае —

//signature.cpp
//#includes...

using namespace std;

    void func(size_t pin) {
        //some def.
    }

тип дампа*, полученный из paramDecl->getType().getTypePtrOrNull() Я получаю AST как:

ElaboratedType 0x1c06b378df0 'size_t' sugar
`-TypedefType 0x1c06b378dc0 'size_t' sugar
  |-Typedef 0x1c06b378b28 'size_t'
  `-BuiltinType 0x1c0698845e0 'unsigned long long'

В этом AST нет информации о std::. Как мне получить эту информацию?

Я могу извлечь «unsigned long long» и использовать его, но в таких случаях я специально ищу способ получить пространства имен.

Большое спасибо.

unsingend long long не находится в пространстве имен
463035818_is_not_an_ai 08.04.2024 08:40

Ожидаете увидеть std::size_t? Если да, удалите using namespace std; таким образом, он найдет size_t в глобальном пространстве имен.

Pepijn Kramer 08.04.2024 08:44

но «size_t» находится в «std», верно? на самом деле мне нужна эта информация, чтобы я мог объявить ее в другом файле как std::size_t.

BitKnight 08.04.2024 08:46

Он также доступен в глобальном пространстве имен, вы только что показали, почему рекомендуется никогда не использовать using namespace std;

Pepijn Kramer 08.04.2024 08:47

Собственно, исходный файл не мой, чтобы менять код. Я пишу инструмент, который может обрабатывать такие случаи.

BitKnight 08.04.2024 08:50

Тогда я бы сказал, что ваш инструмент правильный (а исходный файл, возможно, нет). Он находит тип size_t (псевдоним), который фактически будет использовать код.

Pepijn Kramer 08.04.2024 09:04

да :), но в файле, где я хочу его повторно объявить, я не хочу открывать какие-либо пространства имен, поэтому мне также нужно знать о "std::", чтобы я мог объявить его как " станд::size_t"

BitKnight 08.04.2024 09:07

Для каждого типа T из стандартной библиотеки C типы ::T и std::T зарезервированы для реализации, и, если они определены, ::T должен быть идентичен std::T. Итак, вы хотите добиться того, чтобы вместо size_t ваш инструмент говорил std::size_t, а затем закодируйте его.

Öö Tiib 08.04.2024 10:10

Похоже на stackoverflow.com/questions/25701536/… и stackoverflow.com/questions/57812221/… . Один из них работает? Если нет, не могли бы вы уточнить, указав, каким требованиям они не соответствуют?

Scott McPeak 08.04.2024 11:41

Существует два определения типов: using ::size_t = unsigned long long; и using ::std::size_t = unsigned long long;. В вашем коде предпочтительно используется ::size_t, потому что код написан именно так.

Eljay 08.04.2024 13:38

@ScottMcPeak Эти решения работают в большинстве случаев, но конкретно в этом случае не отображается ::std

BitKnight 09.04.2024 12:18

@BitKnight комментарии пытаются понять, что size_t, вероятно, является правильным ответом. И size_t, и std::size_t являются определениями типов в C++. Вопрос не предоставляет достаточно информации, чтобы убедиться, что size_t не является именем, найденным при поиске неполных имен.

Jeff Garrett 09.04.2024 16:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо за ценные комментарии. Я могу использовать size_t вместо std::size_t, чтобы объявить его в другом файле, поскольку и size_t, и std::size_t являются определениями типов в C++.

Другие вопросы по теме