在c語言中,很多的庫函數都是用宏來實現的,下面我們來看一個函數,你不一定要知道它是什么函數,但你可以看到這個函數是怎么實現的,這個函數是sigfillset(sigset_t *set),是一個來自unix中的定義信號集的一個函數。
sigfillset(sigset_t *set)初始化由set指向的信號集,是其包含所有的信號。這個函數若執行成功則返回0,出錯着返回-1。看一下它在unix中的一個實現。
#define sigfillset(ptr) ((*ptr) = ~(sigset_t)0, 0)
sigset_t是一個整型數,將其所有位至1着表示包含所有信號,每一位代表一個信號。sigfillset函數需要一個返回值,並且必須返回0,所以使用c語言的逗號運算符,它將逗號運算符后面的值作為表達式的返回值。
在使用逗號表達式中有一點需要注意的是,在逗號表達式中不可以聲明變量。
例如:
int n = (int a=5, ++a); //這是錯誤的
你可以這樣使用:
int a;
int n = (a=5, ++a);
那么n的值就是6;
另外在gcc中亦可用{}表達式作為返回值,如:
#define fucn1(a) ({a= a+5; a;})
例如下面一個例子:
#include <stdio.h>
#define func(a) ({a=a+5; a;})
int main(void)
{
//int i;
//int a = (i=5, ++i);
int a=0;
int b = func(a);
printf("a=%d/n", a);
printf("b=%d/n", b);
return 0;
}
那么編譯:gcc main.c
運行:./a.out
輸出:
a=5
b=5