Я пытаюсь извлечь все сигнатуры функций, по сути, полный тип параметров, с пространством имен из источника 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» и использовать его, но в таких случаях я специально ищу способ получить пространства имен.
Большое спасибо.
Ожидаете увидеть std::size_t
? Если да, удалите using namespace std;
таким образом, он найдет size_t в глобальном пространстве имен.
но «size_t» находится в «std», верно? на самом деле мне нужна эта информация, чтобы я мог объявить ее в другом файле как std::size_t.
Он также доступен в глобальном пространстве имен, вы только что показали, почему рекомендуется никогда не использовать using namespace std;
Собственно, исходный файл не мой, чтобы менять код. Я пишу инструмент, который может обрабатывать такие случаи.
Тогда я бы сказал, что ваш инструмент правильный (а исходный файл, возможно, нет). Он находит тип size_t
(псевдоним), который фактически будет использовать код.
да :), но в файле, где я хочу его повторно объявить, я не хочу открывать какие-либо пространства имен, поэтому мне также нужно знать о "std::", чтобы я мог объявить его как " станд::size_t"
Для каждого типа T из стандартной библиотеки C типы ::T и std::T зарезервированы для реализации, и, если они определены, ::T должен быть идентичен std::T. Итак, вы хотите добиться того, чтобы вместо size_t ваш инструмент говорил std::size_t, а затем закодируйте его.
Похоже на stackoverflow.com/questions/25701536/… и stackoverflow.com/questions/57812221/… . Один из них работает? Если нет, не могли бы вы уточнить, указав, каким требованиям они не соответствуют?
Существует два определения типов: using ::size_t = unsigned long long;
и using ::std::size_t = unsigned long long;
. В вашем коде предпочтительно используется ::size_t
, потому что код написан именно так.
@ScottMcPeak Эти решения работают в большинстве случаев, но конкретно в этом случае не отображается ::std
@BitKnight комментарии пытаются понять, что size_t, вероятно, является правильным ответом. И size_t, и std::size_t являются определениями типов в C++. Вопрос не предоставляет достаточно информации, чтобы убедиться, что size_t не является именем, найденным при поиске неполных имен.
Спасибо за ценные комментарии. Я могу использовать size_t вместо std::size_t, чтобы объявить его в другом файле, поскольку и size_t, и std::size_t являются определениями типов в C++.
unsingend long long
не находится в пространстве имен