Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: [ Solved ]Sử dụng typedef ?

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    78

    Mặc định [ Solved ]Sử dụng typedef ?

    Em đọc sách và biết rằng typedef được sử dụng để định nghĩa tên mới cho một kiểu đã có mà không thay đổi chức năng.

    vd:
    PHP Code:
    typedef float real//định nghĩa real chính là float
    typedef charstring//kiểu string chính là char* 

    Thế nhưng khi tham khảo một số code cho MFC hay DLL thì thấy người ta lại làm như thế này

    vd:
    PHP Code:
    void display()
    {
        
    std::cout << "Hello World";
    }

    typedef void (*pf)(); //(*)
    pf display//(**)

    //other statements 
    Không hiểu phần (*) và (**) là như thế nào ? Em thấy (*pf)() đâu phải là tên khác của void đâu

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Bởi vì thằng
    C++ Code:
    1. void display()
    2. { }
    Nó có kiểu là void( * )();
    Chỉ là sugar-syntax của C thôi, C++ dùng functor, polymorphism và template thay thế cho function pointers. Và kiểu của hàm nó là như vậy, nó không phải kiểu của biến.

  3. #3
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    C Code:
    1. typedef void (*pf)();
    pf là con trỏ trỏ tới một hàm không nhận đối số và không trả về giá trị . Dùng typedef để thay thế pf cho các con trỏ như trên ( trỏ đến hàm không nhận đối số và không trả về giá trị) . Do đó một biến có kiểu giá trị pf có thể gán cho giá trị con trỏ tới một hàm void () như hàm display bạn nêu ra .
    C++ Code:
    1. #include <iostream>
    2. void display()
    3. {
    4.     std::cout << "Hello World";
    5. }
    6.  
    7. typedef void (*pf)();
    8. pf func=display;
    9. int main() {
    10.     func();
    11.     system("pause >> NULL");
    12.     return 0;
    13. }
    I'm superman

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    78

    Hiz em vẫn chưa hiểu

    Theo lý thuyết

    Code:
    typedef [kiểu] [tên mới]
    --> vậy thì [tên mới] có thể dùng thay thế cho [kiểu] vì thực ra chúng chỉ là 1, chỉ khác nhau cái tên

    Nhưng đàng này lại là

    Code:
    typedef void (*pf)()
    Chả lẽ (*pf)() thay thế cho void ??? Sao thấy vô lý quá

    Em biết (*pf)() là con trỏ hàm nhưng kiểu khai báo như trên thì ko hiểu

  5. #5
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Hix có gì khó hiểu đâu như trên anh R2 cũng đã nói rồi đấy bạn không đọc kĩ gì cả . Nói theo cách của bạn [tên mới]=pf và [kiểu]=void (*)() chứ không phải (*pf)() thay thế cho void ok .
    I'm superman

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    78

    Mặc định [ Solved ]Sử dụng typedef ?

    Trích dẫn Nguyên bản được gửi bởi trung_dk070384 Xem bài viết
    Hix có gì khó hiểu đâu như trên anh R2 cũng đã nói rồi đấy bạn không đọc kĩ gì cả . Nói theo cách của bạn [tên mới]=pf và [kiểu]=void (*)() chứ không phải (*pf)() thay thế cho void ok .
    Àh nói vậy thì em hiểu rồi
    Nhưng sao cái cú pháp khai báo nó khó hiểu thế Có cách nào khác khai báo cho nó sáng sủa hơn ko ?
    Đã được chỉnh sửa lần cuối bởi howto : 26-11-2008 lúc 01:57 PM.

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Kể ra cách khai báo kiểu con trỏ hàm như vậy cũng khó hiểu. Sao người ta không quy định 1 cách khai báo nhìn sáng sủa hơn, đại loại như
    Code:
    typedef void(*)() pf; //!!!!!
    Em có đọc một số code còn khai báo như sau
    Code:
    typedef void f(void);
    f *pf1;
    Code:
    void (*p[10]) (void (*)() );
    Không biết phải hiểu mấy cái trên như thế nào nữa
    C/C++ có nhiều cách khai báo thật kì lạ !
    Đã được chỉnh sửa lần cuối bởi Hok_bik_zi : 26-11-2008 lúc 04:24 PM.

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Syntax của C/C++ khó mà, chịu thôi, đọc riết rồi quen chứ qui định đã vậy rồi, có chỉnh sữa cũng chẳng được. Nếu pure C syntax thì có mỗi cái function pointer chứ có gì đâu, thằng C++ nó có cái template meta programming đọc và debug thì tha hồ mà bức tóc !

Các đề tài tương tự

  1. Báo lỗi typedef
    Gửi bởi dnv2006 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 22-05-2013, 11:26 PM
  2. Sử dụng typedef trong lập trình C
    Gửi bởi rogerminh2401 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 22-06-2011, 03:27 AM
  3. Câu lệnh typedef nut *node; có tác dụng gì?
    Gửi bởi trankien trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 14-05-2011, 09:43 PM
  4. Khai báo con trỏ khi có typedef ?
    Gửi bởi xOkyox trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 25-10-2010, 08:37 PM
  5. Cho mình hỏi về typedef
    Gửi bởi fcmtuan trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 21-05-2007, 04:04 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn