typeof演算()キーワード

はじめに:

    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

公開された407元の記事 ウォンの賞賛150 ビュー380 000 +

おすすめ

転載: blog.csdn.net/ds1130071727/article/details/102922365
おすすめ