Реализация GCC для поведения переинтерпретации приведения - PullRequest
2 голосов
/ 10 декабря 2011

Как узнать, как будет интерпретироваться приведение к работе на компиляторе GCC? Это упомянуто в документации? Могу ли я узнать какую-либо ссылку или ссылку, если она существует?

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Я использовал reinterpret_cast много раз с g ++.Во встроенном программировании это полезно для отображения struct, представляющего регистры периферийного устройства на его (фиксированный) адрес:

struct DEV_Registers
{
volatile uint32_t REGA;
volatile uint32_t REGB;
// ...
};

static DEV_Registers& DEV(*reinterpret_cast<DEV_Registers>(0x40000000));

. Это позволяет мне писать код, подобный:

DEV.REGB = 0x12345678;

, которыйделает все правильно (установите в регистре 0x40000004 значение 0x12345678) и вполне разборчиво.

Трудно сказать, если ваш вопрос запрашивает подробности помимо этого.

1 голос
/ 11 декабря 2011

Читая документацию в стандарте очень четко о разных типах. Но для основного указателя у нас есть:

Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой для его хранения. Функция отображения определяется реализацией. [ Примечание. Предполагается, что это не удивительно для тех, кто знает структуру адресации базовой машины. - примечание конца ] Значение типа std :: nullptr_t может быть преобразовано в целочисленный тип; преобразование имеет то же значение и действительность, что и преобразование (void *) 0 в целочисленный тип. [Примечание: reinterpret_cast нельзя использовать для преобразования значения любого типа в тип std :: nullptr_t. - конец примечания]

Для целых чисел:

Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно в тот же тип указателя, будет иметь свое первоначальное значение; Отображения между указателями и целыми числами определяются реализацией. [Примечание: за исключением случаев, описанных в 3.7.4.3, результатом такого преобразования не будет безопасно полученное значение указателя. -endnote]

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