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

Đề tài: Giúp đỡ về điểm khác nhau giữa struct và typedef struct

  1. #1
    Ngày gia nhập
    10 2012
    Bài viết
    0

    Mặc định Giúp đỡ về điểm khác nhau giữa struct và typedef struct

    Em đang học về struct và tydef struct nhưng lại không hiểu 2 cái này khác nhau như thế nào.
    hai đoạn code sau khác nhau ở chỗ nào nhỉ?

    Code:
    typedef struct tagNode
    {
         int key;
         tagNode *pNext;
    }Node;
    và code không dùng định nghĩa:


    Code:
    struct aNode
    {
         int key;
         tagNode *pNext;
    };
    Các bạn xem khi đó ta vẫn có thể dùng


    Code:
    aNode myNode;//là một đối tượng
    //không khác gì cả
    so sánh 2 đoạn code sau:

    code1:
    Code:
    #include <iostream>
    using namespace std;
    
    struct Node
    {
         int key;
         Node *pNext;
    };
    
    int main(){
    	Node *myNode = new Node();
    	myNode->key = 100;
    	myNode->pNext = myNode+1;
    	cout<<myNode->key;
    }
    code2:

    Code:
    #include <iostream>
    using namespace std;
    
    typedef struct tagNode
    {
         int key;
         tagNode *pNext;
    }Node;
    
    int main(){
    	Node *myNode = new Node();
    	myNode->key = 100;
    	myNode->pNext = myNode+1;
    	cout<<myNode->key;
    }
    không khác nhau là mấy nhưng mà rõ ràng nếu không dùng typedef thì sẽ viết code ngắn hơn mà



    các bạn có thể cho 1 vài lý do cho từng trường hợp không?

  2. #2
    Ngày gia nhập
    09 2012
    Bài viết
    24

    Ý nghĩa của keyword typedef: dùng để định nghĩa 1 kiểu dữ liệu (data type) mới
    Ví dụ:
    typedef long int DAI; //trong câu lệnh này, DAI chính là kiểu long int
    DAI ten_ban; //dùng DAI thay cho kiểu long int
    Quay trở lại trường hợp của bạn, nếu dùng typedef thì phải như sau:
    Code:
    typedef struct
    {
          int key;
          int data;
    } Node;
    Trong trường hợp trên, Node chính là kiểu struct
    Nhưng vì link list là kiểu dữ liệu tự tham chiếu đến nó (self-referential) nên phải có tên rõ ràng, bạn viết thế này là được rồi:
    Code:
    struct Node
    {
         int key;
         Node *pNext;
    };
    Chúc bạn thành công!

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Một câu lệnh khai báo biến X theo kiểu A, nếu thêm typedef vào đầu câu lệnh thì sẽ biến thành câu lệnh khai báo kiểu mới X tương đương với kiểu A.

    Với struct, với đoạn mã sau:
    C Code:
    1. struct A {
    2. ...
    3. };

    C và C++ có cách xử lý khác nhau:
    - C++ coi rằng A là một kiểu mới
    - C coi struct A là một kiểu mới, tức là từ sau này trở đi nếu muốn khai báo biến kiểu này thì phải ghi đầy đủ. VD:
    C Code:
    1. struct A x;
    2. //A x; //sẽ có lỗi
    Vì có vẻ dài dòng nên người lập trình C mới thường đi kèm typedef với khai báo struct:
    C Code:
    1. typedef struct A {
    2. ...
    3. } B;
    Khi đó B <=> struct A. Do vậy sau này chỉ cần: B x; là đủ, không cần từ khóa struct.

    Với C++ thì hoàn toàn không cần quan tâm đến chuyện này, do code ở #1 là code C++ nên bạn mới thấy thừa.

    Ý kiến cá nhân: đừng nên dùng typedef để đỡ viết từ struct trong lập trình C, vì điều đó làm mã nguồn khó đọc hơn. Người khác đọc vào khó có thể biết được một kiểu A nào đó là kiểu struct hay không struct. Đây là một đoạn trong Linux kernel CodingStyle:
    Code:
    Please don't use things like "vps_t".
    
    It's a _mistake_ to use typedef for structures and pointers. When you see a
    
    	vps_t a;
    
    in the source, what does it mean?
    
    In contrast, if it says
    
    	struct virtual_container *a;
    
    you can actually tell what "a" is.
    
    Lots of people think that typedefs "help readability". Not so. They are
    useful only for:
    
    ...
    
    Maybe there are other cases too, but the rule should basically be to NEVER
    EVER use a typedef unless you can clearly match one of those rules.
    
    In general, a pointer, or a struct that has elements that can reasonably
    be directly accessed should _never_ be a typedef.
    Đừng vì lười gõ vài từ mà sau này làm khổ người khác lẫn làm khổ mình.

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

  1. Gửi struct thông qua socket có khác nhau giữa gửi từng field và gửi cả struct?
    Gửi bởi bptvip_pro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 12-05-2013, 02:35 AM
  2. typedef struct có ý nghĩa gì?
    Gửi bởi F-18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 26-12-2011, 04:58 PM
  3. Lập trình C Lỗi con trỏ trong typedef struct....
    Gửi bởi lytieubinh_269 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 19-11-2011, 12:27 AM
  4. Lập trình C++ Câu lệnh Typedef trong cấu trúc struct có tác dụng gì?
    Gửi bởi mvmanh 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: 07-09-2011, 12:36 AM
  5. Lập trình C cách dùng câu trúc dữ liệu (typedef) struct để viết chuơng trình
    Gửi bởi laimotlanuabi 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: 03-05-2011, 06:46 AM

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