[SOLVED]: pointer-to-object casting και ISO C++

Giorgos Keramidas keramida at ceid.upatras.gr
Thu Mar 2 02:14:05 EET 2006


On 2006-03-02 01:33, Eustathios Kamperis <ekamperi at auth.gr> wrote:
>
> Καλημέρα και πάλι παιδιά :)
>
> Με τις συμβουλές σας, λίγο ψάξιμο και αρκετή τύχη κατάφερα να λύσω το
> πρόβλημά μου.  Παραθέτω το code snippet, για λόγους καθαρά τυπικούς.
>
>     #include <iostream>
>     using namespace std;
>
>     #define FUNCTION_TO_OBJECT_POINTER(function) (reinterpret_cast<const
>     void*>(reinterpret_cast<size_t>(function)))
>
>     void foo(const void *pf) {
>       cout << "Function address: " << pf << endl;
>     }
>
>     void tralala() {
>     }
>
>     int main() {
>       foo(FUNCTION_TO_OBJECT_POINTER(tralala));
>       return 0;
>     }
>
> Για του λόγου το αληθές:
>
>     stathis at ubuntu:~/Projects/C++/pf_iso$ g++ main.cpp -Wall -W -pedantic
>     stathis at ubuntu:~/Projects/C++/pf_iso$ ./a.out
>     Function address: 0x80486a6
>
> Δεν μπαίνω σε επιπλέον τεχνικές λεπτομέρειες. Όποιος θέλει μπορεί να
> ψάξει στο google για την reinterpret_cast.

Επικίνδυνη την κόβω αυτή.  Το παρακάτω παίζει στα μηχανήματα που το
δοκίμασα[1], αλλά είναι όλα UNIX με unified memory address space.

[1] FreeBSD 7.0 (i386, amd64), Solaris 10 (i386, amd64, sparcv9).

Δεν έχω MS-DOS πλέον πουθενά, και δεν ξέρω αν έχει νόημα να το ψάξει
κάποιος, αλλά είμαι περίεργος αν το παρακάτω (λίγο διαφορετικό)
πρόγραμμα παίζει το ίδιο παντού.

Εχω την υποψία ότι δεν παίζει.  Ειδικά όταν sizeof(void *) == 2 (όπως
π.χ. σε κάποια από τα memory models που είπα πριν) και τυχαίνει να είναι
sizeof(&tralala) > 2, θα υπάρξει λίγο truncation ή ακόμα και σκουπίδια
στον pointer που τυπώνεται φοβάμαι.

    #include <iostream>
    #include <iomanip>

    using namespace std;

    #define FUNCTION_TO_OBJECT_POINTER(function) \
      (reinterpret_cast<const void*>(reinterpret_cast<size_t>(function)))

    void
    foo(const void *pf)
    {
      cout << "Function address: " << pf << endl;
    }

    void
    tralala()
    {
    }

    int
    main()
    {
      foo(FUNCTION_TO_OBJECT_POINTER(tralala));

      cout << "size of `const void *'     = "
	   << sizeof(const void *)
	   << endl;
      cout << "size of `size_t'           = "
	   << sizeof(size_t)
	   << endl;
      cout << "size of `function pointer' = "
	   << sizeof(&tralala)
	   << endl;
      return 0;
    }

Ενδιαφέρον πάντως.  Εγώ, τουλάχιστον, ευχαριστώ που έστειλες και την
απάντηση μόλις τη βρήκες.  Μόλις βρω κάποιο DOS μηχάνημα με C++ που να
μπορεί να το μεταγλωττίσει αυτό, θα το δοκιμάσω αμέσως :)))

- Γιώργος




More information about the Linux-greek-users mailing list