typeof () de palabras clave

Prefacio:

    typeof palabra clave es el lenguaje C en una nueva extensión, esta función es ampliamente utilizado núcleo de Linux.

 

En primer lugar, la descripción
    del parámetro typeof puede ser en dos formas: tipo o expresión.

    1, un ejemplo de la expresión:
        typeof (x [0] (1)
        Se supone que x es una matriz de punteros de función, de modo que el tipo del valor de retorno de esta función se puede obtener.
        Si typeof para la expresión, la expresión no se ejecutará. conseguirá solamente el tipo de la expresión.
        el siguiente ejemplo se declara una variable de tipo int var, debido a que la expresión foo () es de tipo int., ya no se ejecuta la expresión, no se llama a la función foo.
            extern int foo ();
            typeof (foo ()) var;

    2, los ejemplos de los parámetros:
        typeof (int *) a, B;
            equivalente a:
            int * a *, B;


II ejemplo
    1, el punto x se define como y tipo de datos:
           typeof (* x) y;
    2, el Y definido como x a los tipos de datos de matrices:
           typeof (* x) y [4].;
    3, la Y se define como una matriz de punteros carácter:.
            typeof (typeof (char *) [4] y;
    que es equivalente a las siguientes definiciones:
            char * Y [. 4];

    4, typeof (int *) p1, p2; / * Declara dos punteros int p1, p2 * /
            int * p1, p2 *;

    5, typeof (int) * p3, p4; / * Declara p3 puntero int y int p4 * /
            int * p3, p4;

    6, typeof (int [10]) a1, a2; / * declara dos matrices de enteros * /

            int a1 [10], a2 [10];

    7, la definición de una macro devuelve un valor máximo, con el fin de evitar llamadas repetidas a la misma como una variable, que puede ser     

       把 MAX (x, y) ((x)> (y)? (X) :( y))

       En MAX (x, y) ({typeof (x) _x = x; \

                typeof (x) _y = y; \

                ? _X> _y _x: _y; \})



En tercer lugar, las limitaciones
    typeof nombre del tipo de estructura no puede contener especificador de clase de almacenamiento, tales como extern o estática. Sin embargo, se permitió que contener calificadores de tipo, tales como const o volátiles.
    Por ejemplo, el código siguiente no es válida, ya que declara extern en la configuración typeof:
        typeof (extern int) A;

cuatro, por ejemplo

1, no saben qué tipo de retorno de la función, se puede utilizar typeof () define una función para recibir el valor de retorno de la variable  

#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,

acceso dinámico al tipo correspondiente de miembros de la estructura en la definición de la macro

El siguiente código, y una variable x se define el mismo tipo de _max1 variables temporales, la definición de una variable y, y el mismo tipo de _max2 variables temporales, y luego determina si o no los dos del mismo tipo, una advertencia es inconsistente, y, finalmente, los comparan.

#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

 


referencia   https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions

Publicados 407 artículos originales · ganado elogios 150 · vistas 380 000 +

Supongo que te gusta

Origin blog.csdn.net/ds1130071727/article/details/102922365
Recomendado
Clasificación