2010-11-02 40 views
8

Tôi hiện đang sử dụng một IDE C++ cho một cái gì đó mà sẽ cần phải làm việc trên C, và muốn đảm bảo rằng tôi sẽ không có vấn đề với điều này sau này. Sau khi thực hiện các cấu trúc dưới đây:struct và typedef trong C so với C++

typedef struct test { 
    int a; 
    int b; 
}; 

tôi sau đó tạo ra một thể hiện của nó bằng cách sử test my_test; sau đó những thứ như my_test.a = 5, vv ... và điều này hoạt động tốt trong VStudio C++ của tôi. Điều này có hoạt động trên gcc sau này không?

Tôi đọc các câu hỏi liên quan xuất hiện (tôi thấy tôi không phải là người đầu tiên với loại câu hỏi này), nhưng không ai có vẻ sử dụng cách tôi đã làm.

Trên thực tế, sự khác biệt giữa typedef struct {//stuff} test; và phiên bản của tôi là gì?

+0

Bạn có thể biên dịch chương trình của mình bằng cách mở dấu nhắc lệnh và gõ: 'gcc FilePath/foo.c'. –

+2

Có thể trùng lặp [typedef struct vs struct definitions] (http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions) Tôi đã viết một câu trả lời mở rộng về sự khác biệt và ý nghĩa cụ thể và thực tế của mỗi của hai cấu trúc đó trong C và C++ là câu trả lời cho câu hỏi được liên kết. Đọc nó để biết chi tiết không có trong câu trả lời được chấp nhận. –

Trả lời

18

Sự khác biệt giữa:

struct Name {}; 

typedef struct Name {} Name; 

Đó là, trong C, bạn cần sử dụng:

struct Name instance_name; 

Với cựu, trong khi với sau này bạn có thể làm:

Name instance_name; 

Trong C++, không cần lặp lại từ khóa struct trong cả hai trường hợp. Lưu ý rằng ví dụ của bạn mà bạn tạo typedef không có tên (tức là typedef struct Name{};) là AFAIK không chuẩn (nếu bạn sử dụng từ khóa typedef thì bạn cần phải cung cấp bí danh để nhập tên đó).

Đối với các biến thể cuối cùng:

typedef struct { /* ... */ } Name; 

Đoạn mã trên tạo ra một cấu trúc vô danh được lấy bí danh là Tên. Bạn sẽ sử dụng cấu trúc giống như cách bạn làm với typedef struct Name { /* ... */ } Name;, tuy nhiên các trình biên dịch thường phát ra tên của cấu trúc (không phải bí danh) và vì vậy bạn có thể nhận được thông báo lỗi tốt hơn liên quan đến cấu trúc nếu bạn đặt tên và typedef trái ngược với typedef'ing một cấu trúc nặc danh.

+0

Tôi chỉ nhận thấy rằng "Cảnh báo" typedef ': bỏ qua bên trái của' thử nghiệm 'khi không có biến nào được khai báo "là những gì tôi nhận được khi tôi làm những việc theo cách tôi đã viết trong đoạn mã gốc của mình. Điều gì đặt ra câu hỏi những gì tôi đã viết thậm chí làm gì? – user472875

+0

@ user472875: Không có gì. Nó giống như viết "typedef int;". Hoặc như viết một định nghĩa trong từ điển mà không đưa ra từ đó có nghĩa là điều đó. –

18
typedef struct THIS_IS_A_TAG 
{ 
    int a; 
    int b; 
} THIS_IS_A_TYPEDEF; 

THIS_IS_A_TYPEDEF object1;  // declare an object.  C:Ok,  C++:Ok 
struct THIS_IS_A_TAG object2; // declare another object. C:Ok,  C++:Ok 
THIS_IS_A_TAG object3;   // declare another object. C:Not Ok, C++:Ok 

Lý do cho typedef là vì các lập trình viên C muốn có thể làm điều thứ ba, nhưng họ không thể.

7

Trong cả hai C và C++, ví dụ xây dựng là một cách khiêm tốn vô nghĩa:

typedef struct test { 
    int a; 
    int b; 
}; 

Trong C, điều này nói rằng có một loại struct test với hai số nguyên như nội dung. Nếu có tên giữa dấu ngoặc ôm '}' và dấu chấm phẩy ';', thì bạn sẽ nhận được một số lợi ích từ từ khóa typedef; như nó đứng, từ khóa typedef là thừa, và (nếu đặt đủ cầu kỳ), GCC sẽ cảnh báo bạn về điều đó.

Trong C++, điều này cho biết có loại struct test; hơn nữa, trong C++, nó cũng tạo ra một loại test (không xảy ra trong C).Từ khóa typedef vẫn có thể bị bỏ qua và kết quả tương tự sẽ đạt được.

Cú pháp là hợp pháp; nó không phải là hữu ích, đó là tất cả. Từ khóa typedef có thể được bỏ qua mà không thay đổi ý nghĩa của chương trình trong ít nhất.

Bạn có thể làm:

typedef struct test { 
    int a; 
    int b; 
} test; 

Bây giờ, trong cả C và C++, bạn có một loại struct test và một bí danh cho nó test.