Что такое C-эквивалент для reinterpret_cast
из С++?
Что такое эквивалент C для reinterpret_cast?
Ответ 1
int *foo;
float *bar;
// c++ style:
foo = reinterpret_cast< int * >(bar);
// c style:
foo = (int *)(bar);
Ответ 2
Стили C-стиля просто напоминают имена типов в скобках:
void *p = NULL;
int i = (int)p; // now i is most likely 0
Очевидно, что лучше использовать для трансляции, чем этот, но это основной синтаксис.
Ответ 3
Это не существует, потому что reinterpret_cast
не может изменить [constness] [3]. Например,
int main()
{
const unsigned int d = 5;
int *g=reinterpret_cast< int* >( &d );
(void)g;
}
приведет к ошибке:
dk.cpp: В функции 'int main()':
dk.cpp: 5: 41: error: reinterpret_cast от типа 'const unsigned int *' для ввода 'int *' отбрасывает квалификаторы
Ответ 4
Листинг C-стиля:
int* two = ...;
pointerToOne* one = (pointerToOne*)two;
Ответ 5
Если вы можете взять адрес значения, одним из способов является указание указателя на него указателю на другой тип, а затем разыменовать указатель.
Например, преобразование float-to-int:
int main()
{
float f = 1.0f;
printf ("f is %f\n", f);
printf ("(int) f is %d\n", (int)f);
printf ("f as an unsigned int:%x\n", *(unsigned int *)&f);
}
Вывод:
f is 1.000000
(int) f is 1
f as an unsigned int:3f800000
Обратите внимание, что это, вероятно, не гарантируется работой по стандарту C. Вы не можете использовать reinterpret_cast для преобразования из float в int в любом случае, но он был бы похож на тип, который поддерживался (например, между разными типами указателей).
Пусть подтверждают, что вывод выше имеет смысл, во всяком случае.
Последний ответ в двоичном формате:
0011 1111 1000 0000 0000 0000 0000 0000
Это формат с плавающей запятой IEEE-754: знаковый бит 0, за которым следует 8-битный показатель (011 1111 1), за которым следует 23-битная мантисса (все нули).
Чтобы интерпретировать экспоненту, вычтите 127: 01111111b = 127 и 127 - 127 = 0. Показатель равен 0.
Чтобы интерпретировать мантиссу, напишите ее после 1, за которой следует десятичная точка: 1.00000000000000000000000 (23 нуля). Это 1 в десятичной форме.
Следовательно, значение, представленное hex 3f800000, равно 1 * 2 ^ 0 = 1, как мы и ожидали.
Ответ 6
Вы можете свободно вводить типы указателей в C, как и любой другой тип.
Чтобы быть полным:
void *foo;
some_custom_t *bar;
other_custom_t *baz;
/* Initialization... */
foo = (void *)bar;
bar = (some_custom_t *)baz;
baz = (other_custom_t *)foo;
Ответ 7
Как насчет оператора REINTERPRET
для c:
#define REINTERPRET(new_type, var) ( * ( (new_type *) & var ) )
Я не люблю говорить "reinterpret_cast", потому что cast означает преобразование (в c), в то время как переинтерпрет означает противоположное: никакого преобразования.