Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: reinterpret_cast как он тут работает?  (Прочитано 2562 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн #define true 0

  • Автор темы
  • Участник
  • *
  • Сообщений: 149
  • В Гугл, животное, кури маны! П.С.:шутка конечно :)
    • Просмотр профиля
reinterpret_cast как он тут работает?
« : 26 Октября 2010, 21:15:15 »

unsigned int a = reinterpret_cast<unsigned int>( &a );

error: cast from ‘unsigned int*’ to ‘unsigned int’ loses precision

под виндой это компилится а как это сделать в Linux?

Пользователь решил продолжить мысль 26 Октября 2010, 21:22:58:
Задача: сохранить адрес переменной

Пользователь решил продолжить мысль 26 Октября 2010, 21:23:19:
как число
« Последнее редактирование: 26 Октября 2010, 21:23:19 от Denis_1 »
CPU :AMD Athlon(tm) II X2 265 Processor 3315MHz | GPU: GeForce GT 240 PCI Express

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #1 : 26 Октября 2010, 21:41:29 »
vidyuk@peti-laptop:~/Development/test/tmp$ cat main.cpp
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    unsigned int a = reinterpret_cast<unsigned int>(&a);
    cout << "a addr is " << a << endl;
    cout << "sizeof(unsigned int) " << sizeof(unsigned int) << endl;
    cout << "sizeof(void *) " << sizeof(void*) << endl;
    return 0;
}
vidyuk@peti-laptop:~/Development/test/tmp$ g++ -Wall main.cpp -o test
vidyuk@peti-laptop:~/Development/test/tmp$ ./test
a addr is 3215263068
sizeof(unsigned int) 4
sizeof(void *) 4
vidyuk@peti-laptop:~/Development/test/tmp$
казалось бы работает. А какая архитектура? Сравни sizeof(unsigned int) и sizeof(void*)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #2 : 27 Октября 2010, 07:25:37 »
Задача сохранить адрес
Рекомендую почитать intptr_t/uintptr_t/ptrdiff_t
и вообще весь сайт. там объясняют "что такое хорошо и что такое плохо"
« Последнее редактирование: 27 Октября 2010, 07:28:23 от Yurror »

Оффлайн #define true 0

  • Автор темы
  • Участник
  • *
  • Сообщений: 149
  • В Гугл, животное, кури маны! П.С.:шутка конечно :)
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #3 : 28 Октября 2010, 23:23:56 »
:~/Документы/test$ cat main.cpp
#include <iostream>

using namespace std;

int main()
{
    unsigned int a = reinterpret_cast<unsigned int>(&a);
    cout << "a addr is " << a << endl;
    cout << "sizeof(unsigned int) " << sizeof(unsigned int) << endl;
    cout << "sizeof(void *) " << sizeof(void*) << endl;
    return 0;
}
:~/Документы/test$ g++ -Wall main.cpp -o test
main.cpp: In function ‘int main()’:
main.cpp:7: error: cast from ‘unsigned int*’ to ‘unsigned int’ loses precision
:~/Документы/test$
К сожалению не работает. Но все равно спасибо!

#include <stdint.h>
uintptr_t a = reinterpret_cast<uintptr_t>(&a);
Это помогло! Спасибо!
(Действительно инт то 4байта, хотя я думал каст обрежет его и кинет ворнинг)
    П.С.: Ubuntu 64
« Последнее редактирование: 28 Октября 2010, 23:25:52 от Denis_1 »
CPU :AMD Athlon(tm) II X2 265 Processor 3315MHz | GPU: GeForce GT 240 PCI Express

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #4 : 29 Октября 2010, 01:29:57 »
Цитировать
#include <stdint.h>
uintptr_t a = reinterpret_cast<uintptr_t>(&a);
Ну небольшая заметка, что стандарт C++ рекомендует использосать cstd* вместо std*.h. Тоесть вот так:
#include <cstdint>
uintptr_t a = reinterpret_cast<uintptr_t>(&a);

Оффлайн #define true 0

  • Автор темы
  • Участник
  • *
  • Сообщений: 149
  • В Гугл, животное, кури маны! П.С.:шутка конечно :)
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #5 : 29 Октября 2010, 18:03:17 »
Почему? На чем это скажется?
CPU :AMD Athlon(tm) II X2 265 Processor 3315MHz | GPU: GeForce GT 240 PCI Express

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: reinterpret_cast как он тут работает?
« Ответ #6 : 29 Октября 2010, 18:21:27 »
Так как C и C++ разные языки и стандарты принимаются независимо, то могут быть разные проблемы. Например текущая версия стандарта C (C99) была принята в 1999 году в то время как текущий стандарт C++ (C++98) был принят в 1998 году. Часть расширений C99 была адаптирована в 2003 году для C++, но не все. Из банальных вещей в C есть тип long long в то время как C++ его нету, хотя большинство компиляторов на это и на многое другое забивают, но никакой гарантии нет, что в ответ на #include <stdint.h> честный C++ компилятор не скажет, что этого самого long long int (который в этом хедере встречается) в природе не существует.

gcc на это забивает, чтобы заставить его генерить предупреждение нужно использовать флаг -pedantic

 

Страница сгенерирована за 0.028 секунд. Запросов: 26.