2013-08-24 44 views
8

Nhiều hơn một vấn đề tò mò hơn bất cứ điều gì. Về cơ bản, tôi muốn biết liệu có thể khai báo nhiều con trỏ hàm trong một dòng hay không, ví dụ như:Làm thế nào để bạn khai báo nhiều con trỏ hàm trong một dòng đơn mà không gõ sai?

int a = 1, b = 2; 

Với con trỏ hàm? Không cần phải sử dụng đến typedef.

Tôi đã thử void (*foo = NULL, *bar = NULL)(int). Không ngạc nhiên, điều này không hiệu quả.

+0

Trong khi tôi đoán đúng, tôi phải nói rằng tôi chưa bao giờ thấy (vì lý do chính đáng) hoặc đã thử điều này trước đây. – chris

+0

mạnh mẽ trong thế giới mã obfuscated ... chỉ cần một vài # def để đại diện cho họ như 6 gạch dưới và bạn đang trong kinh doanh! –

Trả lời

10

Hãy thử như sau:

void (*a)(int), (*b)(int); 

void test(int n) 
{ 
    printf("%d\n", n); 
} 
int main() 
{ 
    a = NULL; 
    a = test; 
    a(1); 
    b = test; 
    b(2); 
    return 0; 
} 

EDIT:

hình thức khác là mảng các con trỏ hàm:

void (*fun[2])(int) = {NULL, NULL}; 

void test(int n) 
{ 
    printf("%d\n",n); 
} 
int main() 
{ 
    fun[0] = NULL; 
    fun[0] = test; 
    fun[0](1); 
    fun[1] = test; 
    fun[1](2); 
} 
+1

Có viết các khai báo của bạn sau 'test() {}' as ['void (* a) (int) = test, (* b) (int) = test;'] (http: // codepad.org/XkYPuwer) –

+0

@GrijeshChauhan Tôi nghĩ rằng hình thức thứ hai tôi vừa chỉnh sửa có nhiều khả năng là cái mà RD muốn – vvy

+0

có thể là, Nhưng phản ứng xuất sắc, Câu trả lời xuất sắc. –

4
void (*foo)(int) = NULL, (*bar)(int) = NULL; 

hoặc như Grijesh nói:

int main(void) { 
    int a[5], b[55]; 
    int (*aa)[5] = &a, (*bb)[55] = &b; 
    return 0; 
} 
+1

bạn có thể muốn thêm con trỏ tương tự vào khai báo mảng có thể được thực hiện: 'int (* a) [5], (* b) [7];' đây là [liên kết mã hóa] (http://codepad.org/) ODgCNXdq) –

+0

Không, tôi đã nói cho các mảng mở liên kết codepad. –

+0

Cảm ơn bạn Grijesh;) –

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