Fonction comme les macros de retourner une valeur
Récemment est venu à travers les exemples suivants, qui renvoie un registre de lecture __ret mais sans une instruction de retour
#define READWORD(offset) ({ \
unsigned short __ret=0;\
__ret = readw(offset);\
__ret; \
})
L'a fait Google sur le même et a révélé que la fonction comme les macros peuvent retourner de valeur. Est-il sûr de supposer que la dernière instruction "_ret" est équivalent à retourner une valeur?
Que faire si j'ai une autre déclaration après "_ret" qui change __ret valeur. Ce qui ferait de retour?
double possible de Peut étendues être enveloppé dans des parenthèses et de retourner une valeur en C?
OriginalL'auteur pkumarn | 2013-05-17
Vous devez vous connecter pour publier un commentaire.
C'est à l'aide de GCC extension appelée Déclaration Des Expressions.
Vous pouvez l'utiliser à moins que vous avez besoin pour être transférable à d'autres compilateurs GCC (et Clang/LLVM).
C'est correct...Dans cet exemple, je ne suis pas sûr de ce que le bénéfice de la déclaration de l'expression est comparé avec
#define READWORD(offset) ((unsigned short)readw(offset))
qui est portable et fait le même travail AFAICS. En général, il ya des choses que vous pouvez faire dans l'Énoncé des Expressions que vous ne pouvez pas faire sans.OriginalL'auteur Jonathan Leffler
Analysons tout cela. Par exemple, nous allons voir ce LISMOT(1) de le faire. Le préprocesseur va insérer ceci:
(
{
unsigned short __ret=0;
__ret = readw(1);
__ret;
}
)
Maintenant, nous pouvons voir ce que c'est. Nous sommes juste à l'appel d'une fonction readw avec un paramètre (1) et de l'affecter à un unsigned short. Après quoi, nous avons juste la ligne __ret; Bien que parfaitement valides, il n'apparaît pas, il ne fait rien. Mais la lecture sur!
Tout ce qui est hors de portée après le final }.
Mais, l'enfermant () faire toute la différence. Élégamment l'ensemble c'est une expression qui a la valeur __ret. Ainsi, vous pouvez attribuer une grandeur. Cela rend le tout remarquablement stable en macro arguments.
Cela détricote?
Oups. Mis en! Je n'avais jamais utiliser dans la pratique que c'est un langage trop loin et perturbe le contrôle de la source responsables. Je veux dire, mon explication est assez déroutant, n'est-ce pas?
OriginalL'auteur Bathsheba