2012-03-26 67 views

Trả lời

56

Không, vì chức năng không phải là dữ liệu. Nhưng bạn có thể định nghĩa các con trỏ hàm bên trong một cấu trúc.

struct foo { 
    int a; 
    void (*workwithit)(struct foo *); 
} 
2

No.

Bạn có thể có con trỏ chức năng trong cấu trúc, nhưng đó là gần như bạn sẽ nhận được.

1

Không, bạn không thể. Structs chỉ có thể chứa các biến bên trong, lưu trữ các con trỏ hàm bên trong cấu trúc có thể cung cấp cho bạn kết quả mong muốn.

0

Không, Bạn không thể xác định các chức năng bên trong các cấu trúc trong các chương trình C, Tuy nhiên nếu phần mở rộng của tập tin của bạn là .cpp (đó không phải là C), bạn có thể có chức năng thành viên như các lớp học tuy nhiên modifier mặc định của những các hàm sẽ là 'công khai' (không giống như lớp).

đọc những liên kết này để biết thêm thông tin về cấu trúc a good link, another good link, One more good link

Như một quy ước trong C++, Lớp được sử dụng cho lưu trữ chức năng và biến cảcấu trúc được sử dụng chỉ để lưu trữ thông tin (ví dụ: dữ liệu).

+5

Những gì bạn có thể có nghĩa là: "Tuy nhiên, nếu bạn biên dịch điều này bằng một ngôn ngữ lập trình khác được gọi là C++ ..." – Lundin

+0

Bạn đúng @Lundin, Thực ra ở cấp độ bắt đầu, ít sinh viên nhầm lẫn bằng cách viết mã C bên trong tệp .cpp, đó thực sự là một thực hành không tốt. – aProgrammer

19

Bạn thực sự không thể khai báo nội dung bên trong cấu trúc trong C. Đây không phải là C++ hoặc bất kỳ ngôn ngữ OO nào khác nơi đối tượng đóng gói một số loại phạm vi.

Cấu trúc C là các đối tượng rất đơn giản, nó chỉ là cú pháp để quản lý một phần bộ nhớ. Khi bạn tạo cấu trúc mới "instance", struct A a;, trình biên dịch chỉ dự trữ không gian ngăn xếp theo kích thước của nó, và khi bạn làm a.member, trình biên dịch biết bù đắp của thành viên, vì vậy nó nhảy tới &a + bù đắp của thành viên đó. Những offset này thường không chỉ là tổng các kích cỡ của các thành viên trước, bởi vì trình biên dịch thường thêm một số bit đệm vào cấu trúc để sắp xếp nó thành bộ nhớ đẹp hơn.

Hy vọng nó đã giúp ích một chút. Bạn rõ ràng mong đợi hơi quá nhiều từ C stuctures :-)

4

Không, bạn không thể có hàm bên trong struct trong chương trình C. Tôi đã viết một mã duy nhất và lưu lại dưới dạng .c và a .cpp. Tệp .cpp tuân thủ và hoạt động như mong đợi, nhưng tệp .c thậm chí không biên dịch.

Đây là mã để bạn tham khảo. Lưu nó một lần như .cpp và sau đó chạy nó. Sau đó lưu cùng mã với .c và biên dịch nó. Bạn sẽ nhận được một lỗi biên dịch.

#include <stdio.h> 
struct C { 
    void Test(int value) { 
     static int var = 0; 
     if (var == value) 
      printf("var == value\n"); 
     else 
      printf("var != value\n"); 

     var = value; 
    } 
}; 

int main() { 
    C c1; 
    C c2; 
    c1.Test(100); 
    c2.Test(100); 
    int ii; 
    scanf("%d",&ii); 
} 
+0

Vì khi không thể có ** hàm ** bên trong ** C ** chương trình? – baldrs

+0

Tôi có nghĩa là.Cấu trúc trong chương trình ac.Đã sửa chữa –

+0

Cố định nó.Thanks –

-2

Không, nhưng bạn có thể trong cấu trúc C++!

+0

Vì vậy, tôi trả lời câu hỏi của mình với "Không", Bạn đã bỏ lỡ phần đó? – NDEthos

-1

Có, bạn có thể khai báo hàm bên trong cấu trúc, vui lòng tham khảo đoạn mã sau.

#include<stdio.h> 
struct A 
{ 
     int a; 
     void (*ptr)(const struct A*); 
}; 
void display(const struct A*p) 
{ 
     //p->a = 10; //It is not possible because structure is constant 
     printf("Display fun :%d\n",p->a); 
} 
void print(struct A*ptr) 
{ 
     ptr->a = 20; 
     printf("Print fun :%d\n",ptr->a); 
} 

int main() 
{ 
     struct A obj = {5}; //Structure initialization 
     display(&obj); 
     print(&obj); 
     return 0; 
} 
Các vấn đề liên quan