はじめに:
typeofをキーワードに新しい拡張で、C言語では、この機能が広く使われているLinuxカーネルです。
まず、
タイプまたは式:typeof演算パラメータは、2つの形態であってもよいです。
図1に示すように、式の例:
typeof演算(X [0](1)
。xがこの関数の戻り値の型が得られるように、関数ポインタの配列であることが想定される
typeofを発現させるための場合は、式実行されません。だけで式の型を取得します。
表現fooは()int型であるため、次の例では、int型のVARの変数を宣言します。式が実行されていないので、それがfoo関数を呼び出していません。
EXTERNをFOOのINT();
typeof演算(FOO())VAR;
2、パラメーターの例:
typeof演算(INT *)、B;
に相当する:
INT *、* B;
II実施例
1、点xがyと定義されます。データタイプ:
typeof演算(* X)Y;
2、配列のデータ型にXとして定義Y:
typeof演算(* X)Y [4];
3、yは文字ポインタの配列として定義される:
typeof演算(typeof演算(CHAR *)[4] Y、
以下の定義に相当する:
CHAR * Y [4]。
4、typeof演算(INT *)P1、P2。/ * 2 int型のポインタP1、P2 * /宣言
int型* P1、P2 *;
5、typeof演算(INT)* P3、P4; / *宣言INTポインタP3とP4のint * /
INT * P3、P4。
6、typeof演算(INT [10])A1、A2; / *整数の二つの配列を宣言/
INT A1の[10]、A2 [10]。
7、マクロ返す最大値の定義は、変数と同様に繰り返し呼び出しを回避するために、それがあってもよいです
把MAX(x、y)は((X)>(Y)?(X):( Y))
MAX(X、Y)に({typeof演算(X)_x = X; \
typeof演算(X)_y = Y; \
?_x> _y _x:_y; \})
第三には、制限
構造型名typeof演算は、このようなのexternまたはstaticのような記憶クラス指定子を含めることはできません。しかし、このようconstまたはvolatileとして、型修飾子を含有させます。
それはtypeof演算構成でのextern宣言するので、例えば、次のコードは、有効ではありません:
typeof演算(EXTERN INT)A;
4、例えば
1)(typeof演算を使用することができる関数の戻り値の種類、わからない変数の戻り値を受信するための関数を定義します
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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.\n");
return;
}
a1->weight = 2;
a1->color = 1;
return a1;
}
int main(int argc, char *argv[])
{
typeof(get_apple_info()) r1;//定义一个变量r1,用于接收函数get_apple_info()返回的值,由于该函数返回的类型是:struct apple *,所以变量r1也是该类型。注意,函数不会执行。
r1 = get_apple_info();
printf("apple weight:%d\n", r1->weight);
printf("apple color:%d\n", r1->color);
return 0;
}
2、
マクロ定義で構造体のメンバの関連するタイプへの動的アクセス
次のコードは、変数X一時変数_max1、変数yの定義、および一時的な変数_max2の同じ種類の同じタイプを定義し、次に警告が矛盾して、最終的にそれらを比較し、両方が同じタイプか否かを判断します。
#define max(x, y) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
(void) (&_max1 == &_max2); \//如果调用者传参时,两者类型不一致,在编译时就会发出警告。
_max1 > _max2 ? _max1 : _max2; })
3、
//其它用法1
char *p1;
typeof (*p1) ch = 'a'; //ch为char类型,不是char *类型。
printf("%d, %c\n", sizeof(ch), ch);//1, a
//其它用法2
char *p2;
typeof (p2) p = "hello world";//此时的p才是char *类型,由于在64位机器上,所以指针大小为8字节
printf("%d, %s\n", sizeof(p), p);//8, hello world
参考 https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions