Thủ tục chung : tìm số nhận dạng ngoài cùng bên trái và làm việc theo cách của bạn. Không có nhóm rõ ràng với dấu ngoặc đơn, các toán tử hậu tố như ()
và []
ràng buộc trước các toán tử đơn nhất như *
; do đó, sau đây là tất cả sự thật:
T *x[N] -- x is an N-element array of pointer to T
T (*x)[N] -- x is a pointer to an N-element array of T
T *f() -- f is a function returning a pointer to T
T (*f)() -- f is a pointer to a function returning T
Áp dụng những quy tắc để việc kê khai, nó phá vỡ xuống như
signal -- signal
signal( ) -- is a function
signal( signo, ) -- with a parameter named signo
signal(int signo, ) -- of type int
signal(int signo, func ) -- and a parameter named func
signal(int signo, *func ) -- of type pointer
signal(int signo, (*func)( )) -- to a function
signal(int signo, (*func)(int)) -- taking an int parameter
signal(int signo, void (*func)(int)) -- and returning void
*signal(int signo, void (*func)(int)) -- returning a pointer
(*signal(int signo, void (*func)(int)))( ) -- to a function
(*signal(int signo, void (*func)(int)))(int) -- taking an int parameter
void (*signal(int signo, void (*func)(int)))(int); -- and returning void
Nói tóm lại, signal
trả về một con trỏ tới một hàm trả về void
. signal
lấy hai tham số: một số nguyên và một con trỏ tới hàm khác trả về void
.
Bạn có thể sử dụng typedef để giúp dễ đọc hơn (và trang hướng dẫn cho signal
trên Ubuntu Linux thực hiện điều đó); tuy nhiên, tôi nghĩ rằng nó có giá trị để hiển thị phiên bản không được đánh máy để chứng minh chính xác cú pháp hoạt động như thế nào. Các cơ sở typedef là tuyệt vời, nhưng bạn thực sự cần phải hiểu làm thế nào các loại cơ bản làm việc để sử dụng nó một cách hiệu quả.
Chức năng signal
thiết lập bộ xử lý tín hiệu; đối số thứ hai là hàm sẽ được thực thi nếu nhận được tín hiệu. Một con trỏ tới trình xử lý tín hiệu hiện tại (nếu có) được trả về.
Ví dụ, nếu bạn muốn chương trình của bạn để xử lý tín hiệu ngắt (chẳng hạn như từ Ctrl-C):
static int g_interruptFlag = 0;
void interruptHandler(int sig)
{
g_interruptFlag = 1;
}
int main(void)
{
...
/**
* Install the interrupt handler, saving the previous interrupt handler
*/
void (*oldInterruptHandler)(int) = signal(SIGINT, interruptHandler);
while (!g_interruptFlag)
{
// do something interesting until someone hits Ctrl-C
}
/**
* Restore the previous interrupt handler (not necessary for this particular
* example, but there may be cases where you want to swap out signal handlers
* after handling a specific condition)
*/
signal(SIGINT, oldInterruptHandler);
return 0;
}
EDIT tôi mở rộng mã ví dụ cho signal
để cái gì đó là hy vọng minh họa hơn.
Nhận 'cdecl'. Nó sẽ cho bạn biết tất cả những điều này. Tôi hỏi: 'giải thích void (* tín hiệu (int, void (*) (int))) (int);' và nó trả lời: 'khai báo tín hiệu như hàm (int, pointer to function (int) return void) trả về con trỏ đến function (int) trả về void' –
thử http://cdecl.org/ –