Co to jest ekwiwalent C dla reinterpret_cast
z C++?Jaki jest ekwiwalent C dla reinterpret_cast?
Odpowiedz
int *foo;
float *bar;
// c++ style:
foo = reinterpret_cast< int * >(bar);
// c style:
foo = (int *)(bar);
Proszę również zwrócić uwagę na bardzo dobry punkt litb w komentarzach do pierwotnego pytania. – Crashworks
C-styl odlewy prostu wyglądać nazw typów w nawiasie:
void *p = NULL;
int i = (int)p; // now i is most likely 0
Oczywiście istnieją lepsze zastosowania dla odlewów niż ten, ale to składnia podstawowe.
Dlaczego "najprawdopodobniej" "Jaki byłby tutaj wyjątek? – bzeaman
Można swobodnie rzucać rodzajów wskaźnik w C tak samo jak każdy inny rodzaj.
Aby być pełne
void *foo;
some_custom_t *bar;
other_custom_t *baz;
/* Initialization... */
foo = (void *)bar;
bar = (some_custom_t *)baz;
baz = (other_custom_t *)foo;
Możesz dowolnie rzutować dowolny typ, może po prostu nie robić tego, co masz nadzieję, i nie można zagwarantować, że cokolwiek zrobisz. –
nie istnieje, ponieważ nie można zmienić reinterpret_cast
[constness] [3]. Na przykład,
int main()
{
const unsigned int d = 5;
int *g=reinterpret_cast< int* >(&d);
(void)g;
}
będzie produkować błąd:
dk.cpp: In function 'int main()':
dk.cpp:5:41: error: reinterpret_cast from type 'const unsigned int*' to type 'int*' casts away qualifiers
Jeśli można wziąć adres wartości, jednym ze sposobów jest do oddania wskaźnik do niego do wskaźnika do innego typu, a następnie usuń zaznaczenie wskaźnika.
Na przykład konwersja pływaka do 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);
}
wyjściowa:
f is 1.000000
(int) f is 1
f as an unsigned int:3f800000
Należy pamiętać, że jest to prawdopodobnie nie jest gwarantowana do pracy w standardzie C. Nie można użyć reinterpret_cast do rzutowania z float na int mimo to, ale byłby podobny do typu, który był obsługiwany (na przykład między różnymi typami wskaźników).
Załóżmy, że powyższe wyjście ma sens.
Ostatnia odpowiedź w systemie binarnym:
Jest IEEE-754 pływający Format punkt nieco znakiem 0, po którym następuje 8 -bit exponent (011 1111 1), a następnie 23-bitowa mantysa (wszystkie zera).
Aby zinterpretować wykładnik odjąć 127: 01111111b = 127, i 127 - 127 = 0. wykładnikiem 0.
Aby zinterpretować mantysę napisać to po 1 a następnie po przecinku dziesiętnym: +1,00000000000000000000000 (23 zer). Jest to 1 w systemie dziesiętnym.
W związku z tym wartość reprezentowana przez heks 3f800000 wynosi 1 * 2^0 = 1, zgodnie z naszymi oczekiwaniami.
Co o REINTERPRET
operatora dla C:
#define REINTERPRET(new_type, var) (* ((new_type *) & var))
nie lubią mówić „reinterpret_cast”, ponieważ obsada oznacza konwersję (w C), natomiast reinterpretacji oznacza przeciwieństwo: brak konwersji.
Dlaczego ktoś powinien to zrobić? To wprowadza w błąd. Nie twórz nieskomunikowanego kodu. –
- 1. Jaki jest ekwiwalent C# operatora powtórzeń Perla?
- 2. jaki jest ekwiwalent C# statycznego {...} w Javie?
- 3. Jaki jest ekwiwalent C# dla Oracle PL/SQL COALESCE?
- 4. Jaki jest ekwiwalent WPF dla komponentów WinForms?
- 5. Jaki jest ekwiwalent GWT dla setTimeout?
- 6. Jaki jest ekwiwalent Rubiego dla Pythona setup.py?
- 7. Jaki jest ekwiwalent Kotlina dla Java's String []?
- 8. reinterpret_cast
- 9. Jaki jest ekwiwalent Objective-C funkcji `map()` JS?
- 10. Jaki jest ekwiwalent DOS dla 1>/dev/null?
- 11. Jaki jest ekwiwalent Spring DI InjectionPoint CDI?
- 12. Jaki jest ekwiwalent Rubinowy os.walk Pythona?
- 13. Jaki jest ekwiwalent tras rake w Phoenix?
- 14. ekwiwalent ltrace dla osx?
- 15. Ekwiwalent selera dla JoinableQueue
- 16. Co to jest ekwiwalent C# Java DecimalFormat?
- 17. Jaki jest ekwiwalent IE do przewijania przepełnionego webkita: dotknij
- 18. Jaki jest ekwiwalent SET typu danych MySQL w schemacie Laravel?
- 19. Jaki jest ekwiwalent ZF2 metody quoteInto() w ZF1?
- 20. ekwiwalent find_by_sql dla mongoid?
- 21. jQuery (ekwiwalent dla getComputedStyle)
- 22. Ekwiwalent GetPositionAtOffset tylko dla tekstu?
- 23. const_cast vs reinterpret_cast
- 24. Ekwiwalent Ionic Framework dla Knockout?
- 25. Ekwiwalent objcopy dla Mac/iPhone'a?
- 26. Ekwiwalent WKWebView dla wag UIWebViewPageToFit
- 27. C#'s LINQ dla manipulacji zbiorami ekwiwalent w ruby
- 28. reinterpret_cast rzuca dala kwalifikatorów
- 29. W prostym C, jak zrobić ekwiwalent "mapy"?
- 30. Jaki jest ekwiwalent clojure Nokogiri (dla parsowania xml z selektorami xpath i css)
Zauważ, że ekwiwalent C dla '' (type) 'może znacznie więcej niż" reinterpretować "w C++ (cóż, w końcu są to dwa różne języki - więc i tak nie możemy się wiele spodziewać). Może rzutować na siebie typy liczb całkowitych i zmiennoprzecinkowych. Nie wyciągaj wniosków z odpowiedzi, że '(typ) wyrażenie' w C++ jest równoważne' reinterpret_cast'. –
@litb To jest ciekawy komentarz. Sprawdziłem kod produkowany przez VC2008 i pomija ten sam kod. Jestem pewien, że to nie wystarczy, ale naprawdę chcę wiedzieć więcej, kiedy to się różni? – AraK
Odmienne przypadki błędu czasu kompilacji i niezdefiniowanego zachowania: 'int a = reinterpret_cast (" a ");' (błąd kompilacji). 'struct A {int a; }; struct B {int b; }; struct C: A, B {int c; }; int main() {C c; B & b = reinterpret_cast (c); b.b = 1; } '(niezdefiniowane zachowanie: zauważ różnicę po zmianie na' (B &) c': jeśli obiekt podrzędny B jest przechowywany z przesunięciem '! = 0x0', to' reinterpret_cast' nie jest wymagane, aby zadbać o wszelkie niezbędne korekty , podczas gdy odleje w stylu C. –