??? typeof() 是GUN C提供的一種特性,它可以取得變量的類型,或者表達(dá)式的類型。
? ? 本文總結(jié)了typeof()關(guān)鍵字的常見用法,并給出了相應(yīng)的例子,以加深理解。
typeof()關(guān)鍵字常見用法一共有以下幾種
1. 不用知道函數(shù)返回什么類型,可以使用typeof()定義一個(gè)用于接收該函數(shù)返回值的變量。
#include? 2.?在宏定義中動(dòng)態(tài)獲取相關(guān)結(jié)構(gòu)體成員的類型 ????#include #include struct apple{ int weight; int color; }; struct apple *get_apple_info() { struct apple *a1; a1 = malloc(sizeof(struct apple)); if(a1 == NULL) { printf("malloc error. "); return; } a1->weight = 2; a1->color = 1; return a1; } int main(int argc, char *argv[]) { //定義一個(gè)變量r1,用于接收函數(shù)get_apple_info()返回的值,由于該函數(shù)返回的類型是:struct apple *,所以變量r1也是該類型。注意,函數(shù)不會(huì)執(zhí)行。 typeof(get_apple_info()) r1; r1 = get_apple_info(); printf("apple weight:%d ", r1->weight); printf("apple color:%d ", r1->color); return 0; }
如下代碼,定義一個(gè)和變量x相同類型的臨時(shí)變量_max1,定義一個(gè)和變量y相同類型的臨時(shí)變量_max2,再判斷兩者類型是否一致,不一致給出一個(gè)警告,最后比較兩者。
#define max(x, y) ({
typeof(x) _max1 = (x);
typeof(y) _max2 = (y);
(void) (&_max1 == &_max2); //如果調(diào)用者傳參時(shí),兩者類型不一致,在編譯時(shí)就會(huì)發(fā)出警告。
_max1 > _max2 ? _max1 : _max2; })
? ????如下代碼,傳入的a和b不是同一類型。
int main(int argc, char *argv[])
{
int a = 3;
float b = 4.0;
int r = max(a, b);
printf("r:%d
", r);
return 0;
}
? ????此時(shí)編譯就會(huì)出現(xiàn)警告:
[root@xx c_base]# gcc test.c test.c: 在函數(shù)‘main’中: test.c:43: 警告:比較不相關(guān)的指針時(shí)缺少類型轉(zhuǎn)換? 3. 也可直接取得已知類型 ????
如下代碼,定義了一個(gè)int類型的指針p,像這種用法沒什么太大的意義了。
int a = 2;
typeof (int *) p;
p = &a;
printf("%d
", *p);
? 4. 其它用法
//其它用法1
char *p1;
typeof (*p1) ch = 'a'; // ch為char類型,不是char *類型。
printf("%d, %c
", sizeof(ch), ch); // 1, a
//其它用法2
char *p2;
typeof (p2) p = "hello world"; // 此時(shí)的p才是char *類型,由于在64位機(jī)器上,所以指針大小為8字節(jié)
printf("%d, %s
", sizeof(p), p); // 8, hello world
? 5. 總結(jié) ????以上例子并沒有窮舉所有的情況,但其核心用法基本上就會(huì)了,其它的例子也可參考網(wǎng)上的例子。
?
審核編輯:湯梓紅
?
電子發(fā)燒友App























評(píng)論