mot-clé typeof ()

Avant-propos:

    typeof mot-clé est le langage C dans une nouvelle extension, cette fonction est largement utilisé le noyau linux.

 

Tout d' abord, la description
    paramètre typeof peut être sous deux formes: le type ou l' expression.

    1, un exemple de l'expression:
        typeof (x [0] (1)
        On suppose que x est un tableau de pointeurs de fonction, de sorte que le type de la valeur de retour de cette fonction peut être obtenue.
        Si typeof pour l' expression, l'expression ne sera pas exécuté. ne fera que le type de l'expression.
        l'exemple suivant déclare une variable de type int var, parce que l'expression foo () est de type int. puisque l'expression est pas exécutée, il ne remet pas la fonction foo.
            extern foo int ();
            typeof (foo ()) var;

    2, des exemples de paramètres:
        typeof (int *) a, B,
            équivalent à:
            int * a, * B;


II exemple
    1, le point x est défini comme y le type de données:
           typeof (* x) y;
    2, Y défini comme x aux types de données des tableaux:
           typeof (* x) y [4].;
    3, Y est défini comme un réseau de pointeur de caractère:.
            typeof (typeof (char *) [4] y, ce
    qui est équivalent aux définitions suivantes:
            char * Y [. 4];

    4, typeof (int *) p1, p2; / * Déclare deux pointeurs int p1, p2 * /
            int * p1, * p2;

    5, typeof (int) * p3, p4; / * pointeur int Déclare p3 et p4 int * /
            int * p3, p4;

    6, typeof (int [10]) a1, a2; / * Déclare deux tableaux d'entiers * /

            int a1 [10], a2 [10];

    7, la définition d'une macro renvoie une valeur maximale, afin d'éviter des appels répétés à la même variable, il peut être     

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

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

                typeof (x) _y = y; \

                ? _X> _y _x: _y; \})



En troisième lieu , les limites
    typeof nom du type de structure ne peut pas contenir spécificateur de classe de stockage, tels que extern ou statique. Toutefois, a permis de contenir un qualificateur de type, tels que const ou volatile.
    Par exemple, le code suivant n'est pas valide, car il déclare extern dans la configuration typeof:
        typeof (extern int) A;

quatre, par exemple

1, ne savent pas quel type de retour de la fonction, peut être utilisé typeof () définit une fonction pour recevoir la valeur de retour 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,

Accès dynamique au type de membres de la structure pertinente dans la définition macro

Le code suivant, et une variable x est défini le même type de _max1 variables temporaires, la définition d'une variable y, et le même type de _max2 variables temporaires et détermine alors si oui ou non les deux du même type, un avertissement est incompatible, et enfin les comparer.

#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

 


référence   https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions

Publié 407 articles originaux · louange gagné 150 · vues 380 000 +

Je suppose que tu aimes

Origine blog.csdn.net/ds1130071727/article/details/102922365
conseillé
Classement