2013-08-27 39 views
6

typedef int (xxx)(int yyy); nghĩa là xác định hàm có tên xxx với tham số nguyên. bạn có thể xem số này SO post để biết chi tiết.Hàm typedef làm tham số của hàm khác

Tôi đã thử này theo những cách khác nhau, đó là mã của tôi:

#include<stdio.h> 
#include<stdlib.h> 
typedef int (xxx)(int yyy); 

void f1(xxx a) 
{ 
    printf("f1:%d\n",a); 
} 
void f2(xxx *a) 
{ 
    printf("f2:%d\n",a); 
} 
int test(int y) 
{ 
} 
int main() 
{ 
    xxx *a; 
    f1(test); 
    f1(a); 
    f2(test); 
    f2(a); 

    xxx b; 
    printf("xxx's size:%d\n", sizeof(b)); 
} 

đầu ra:

f1:4199274 
f1:2 
f2:4199274 
f2:2 
xxx's size:1 

Câu hỏi của tôi:

  1. f(xxx a) cũng giống như f(xxx *a)?
  2. sizeof(someFunction) được xác định hay không?
+1

Về (2), cả 'sizeof (function)' và 'sizeof (function-type)' không hợp lệ là C. Tuy nhiên, 'sizeof (function-ptr-type)' là hoàn toàn tốt. Tôi phải kiểm tra tiêu chuẩn để xác nhận những nghi ngờ của tôi về (1) trước khi bình luận thêm. – WhozCraig

Trả lời

8

phương tiện xác định một chức năng mà được đặt tên xxx

Nó định nghĩa một hàm loại.

f (xxx a) giống như f (xxx * a)?

Có. Nhưng đây là loại hack trong ngôn ngữ. Ngôi sao chỉ được thêm một cách hữu ích cho bạn vì nó bị thiếu.

sizeof (someFunction) được xác định hay không?

Cụ thể là không. Bạn có thể làm điều này với ngôn ngữ assembly, hoặc bằng cách sử dụng kiến ​​thức thân mật về cách chương trình của bạn được liên kết, nhưng nó không có ý nghĩa ngữ nghĩa đối với C. Hàm thậm chí không cần địa chỉ ngoài nhảy gián tiếp, như C hỗ trợ các máy kiến ​​trúc Harvard. (Ngoài ra, lưu ý rằng hai chức năng với cùng loại thường sẽ có kích cỡ khác nhau, như kích thước được xác định bởi số lượng và tính chất của các hướng dẫn của nó.)

C11 6.3.2.1/4 nói

Một function designator là một biểu thức có kiểu hàm. Ngoại trừ khi nó là toán hạng của toán tử sizeof,… một trình chỉ định hàm có loại ‘‘ kiểu trả về hàm ’’ được chuyển đổi thành một biểu thức có kiểu con trỏ là ‘return to type return’ ’.

và 6.5.3.4/1 nói

Nhà điều hành sizeof sẽ không được áp dụng cho một biểu thức có kiểu chức năng ...

Dường như trình biên dịch của bạn thất bại trong việc áp dụng 6.3 .2.1/4. Một thông báo lỗi là bắt buộc.

+0

+1 (và bài đăng tuyệt vời của bạn được liên kết trong câu hỏi của OP, cũng lên tiếng bình chọn). – WhozCraig

+0

Thực sự cảm ơn ..Nhưng tôi tự hỏi, làm thế nào bạn có thể biết rất nhiều chi tiết về ngôn ngữ C? Và trả lời câu hỏi này (tôi nghĩ nó rất khó ..) nhanh vậy? – Sayakiss

+0

Tôi sử dụng mã :: khối IDE, nó làm: 'mingw32-gcc.exe -c ac -o ao' trước, sau đó ' mingw32-g ++. Exe -o a.exe ao' – Sayakiss

Các vấn đề liên quan