не совсем понимаю, что такое: значение uintptr_t (astruct.val) - PullRequest
1 голос
/ 27 февраля 2012

Я нашел следующий синтаксис в исходном файле c ++ (не в заголовке):

template <typename Type_> static void aFunction(Type_ &function, ...) {
    uintptr_t value(astruct.val); //confusing
}

Эта запутанная строка - объявление значения? Я пытался написать программу Hello World, например:

int main(){ uintptr_t a(80); return 0;}

и он возвращает ожидаемые спецификаторы объявления или "..." перед числовой константой, могу ли я узнать, что делает эта запутанная строка? Спасибо!

Редактировать: я думаю, что я должен раскрыть полное объявление функции:

    template <typename Type_>
static void nlset(Type_ &function, struct nlist *nl, size_t index) {
    struct nlist &name(nl[index]);
    uintptr_t value(name.n_value);// this is the confusing line
    if ((name.n_desc & N_ARM_THUMB_DEF) != 0)
        value |= 0x00000001;
    function = reinterpret_cast<Type_>(value);
}

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Как вы, кажется, знаете, std::uintptr_t - это стандартный тип из заголовка <cstdint> (начиная с C ++ 11).

Строка, которую вы не понимаете, представляет собой простое объявление переменной + определение:

uintptr_t value(name.n_value);

Это объявляет переменную с именем value типа uintptr_t и инициализирует ее значением name.n_value.Для фундаментальных типов это эквивалентно:

uintptr_t value = name.n_value;

Я попытался написать программу hello world, такую ​​как:

int main(){ uintptr_t a(80); return 0;}

, и она возвращает ошибку [...]

Какая ошибка?Всегда публикуйте сообщение об ошибке, которое вы получаете, никто не может помочь вам с «Я получил ошибку»!

Я подозреваю, что ошибка, которую вы получаете, вызвана тем, что uintptr_t не определено, если вы не включите <cstdint>, а затем вы должны использовать префикс std namespace.

1 голос
/ 27 февраля 2012

uintptr_t - целое число без знака (по крайней мере) размером указателя.

Это не нативный тип, и вам нужно включить <stdint.h> или <cstdint>

Действительно«зло» приводить указатели к целым и сохранять их как целочисленные переменные, но существует много «устаревшего» кода, который делает это и полагается на него, и поэтому вам нужен достаточно большой размер int для его хранения.

Хранение их как целых чисел позволяет вам делать вещи, которые вы можете делать с целыми числами «безопасно», но не с указателями, например сравнивать их, когда они не входят в один и тот же диапазон, чтобы использовать их в памяти.контролеры утечки и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...