2016-10-01 20 views
6

Hãy xem mã này:Tên chức năng hoặc con trỏ hàm?

#include <stdio.h> 

typedef int (*callback) (void *arg); 
callback world = NULL; 

int f(void *_) { 
    printf("World!"); 
    return 0; 
} 

int main() { 
    printf("Hello, "); 
    // world = f; 
    world = &f; // both works 
    if (world != NULL) { 
     world(NULL); 
    } 
} 

Khi cài đặt world biến, cả world = f;world = &f; công trình.

Tôi nên sử dụng thông tin nào? Liệu nó phụ thuộc vào trình biên dịch hoặc phiên bản C?

% gcc -v 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.0.0 (clang-800.0.38) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
+4

http://stackoverflow.com/questions/6293403/in-c-what-is-the-difference-between-function-and-function-when-passed-as-a – Pavel

+0

http: // stackoverflow .com/questions/3674200/what-do-a-typedef-với-dấu ngoặc đơn-như-typedef-int-fvoid-có nghĩa là-là-nó-a –

Trả lời

2

Cả hai world = f;world = &f; hoạt động vì không có sự khác biệt giữa f&f khi chuyển nó làm đối số.

Xem thông số C99 (phần 6.7.5.3.8).

Tuyên bố tham số là ‘loại trả về chức năng’ ’sẽ được điều chỉnh thành‘ con trỏ thành kiểu trả về hàm ’’, như trong 6.3.2.1.

1

Chức năng của bạn f là loại int (void *_). Bất cứ khi nào f được sử dụng trong một biểu thức, nó được chuyển đổi hoàn toàn thành một con trỏ đến chính nó, là loại int(*) (void *_).

Tôi nên sử dụng thông tin nào?

Vì vậy, cho tất cả mục đích thực tế, tên của hàm f và con trỏ đến cùng chức năng &f có thể hoán đổi cho nhau. Ngoài ra, hãy xem "Why do all these function pointer definitions all work? "

Điều đó có phụ thuộc vào trình biên dịch hoặc phiên bản C không?

Không phụ thuộc vào bất kỳ trình biên dịch hoặc phiên bản C nào.

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