Question

J'ai une fonction hexdump de travail, mais il semble être surpuissant pour l'impression d'une seule variable. Donc, je suis en train de faire une macro pour elle. Jusqu'à présent, cela fonctionne presque parfaitement:

#define PRINT_FMT2(val,des,fmt) printf(#des" = "fmt": "SRC_STRN,val)
// SRC_STRN is a macro that evals to string literal containing file and line# 

#include <stdint.h>
#define PRINT_HEX(x) PRINT_FMT2((*((uint32_t*)(&(x)))),x,"%x") 
// the lack of parens around 2nd arg to PRINT_FMT2 is okay cause it gets #'d

Le seul problème avec ceci est que je ne peux pas l'utiliser avec la valeur de retour d'une fonction. Je reçois le lvalue required as unary '&' operand d'erreur. Je pense que cela signifie que je ne peux pas utiliser cette méthode de coulée à ptr ptr uint-. Est-il un autre moyen efficace de le faire?

Modifier : Je voudrais mentionner que ce que la plupart des gens est passé sous silence que je voulais voir mon conservé peu de valeur et converti en un format unsigned int hexadécimal. Notez que vous pouvez utiliser ma macro avec un float l valeur et recrache la représentation big-endian correcte. La plupart des réguliers routines Hexadécimal seront imprimées sur les bits comme il est écrit dans la mémoire, qui est clairement dépendante boutisme. Mon mauvais pour ne pas être clair sur ce que je voulais dire.

Quoi qu'il en soit, je fini par écrire un ensemble de fonctions surchargées qui peuvent être utilisées avec une valeur r. En fin de compte, je ne voulais vraiment juste pour l'utiliser sur flotteurs 32 bits.

inline uint32_t tohex(float f) { 
  uint32_t* u = (uint32_t *)&f; return *u; 
}
Était-ce utile?

La solution

Les macros doit être utilisé avec parcimonie, car ils sont très sujettes bug, et difficile à déboguer.

Dans ce cas, vous n'obtiendrez un gain de performance de l'utilisation d'une macro, car une courte fonction comme cela va probablement s'inline.

Vous obtiendrez un gain de lisibilité en utilisant une fonction. Il y a aussi beaucoup de langue que vous obtenez des fonctions caractéristiques, telles que la surcharge, la sécurité de type, et le potentiel de le transmettre comme un pointeur de fonction. Vous ne pouvez pas besoin d'eux maintenant, mais vous pourriez à l'avenir.

Il sera également plus facile d'écrire.

Dans l'ensemble, une fonction est beaucoup bien meilleur choix dans ce cas.

Plus il y a déjà des fonctions intégrées dans la langue pour faire ce que vous essayez de faire, à la fois en C ++ et en C (si vous avez besoin de la vitesse).

Modifier

Si vous voulez vraiment savoir comment faire une macro, et que vous voulez savoir pourquoi cela ne fonctionne pas, voir la réponse de dappawit.

Autres conseils

Le message d'erreur vous dit que vous ne pouvez pas prendre l'adresse de la valeur de retour, car il n'est pas une valeur L. Pour prendre l'adresse, vous avez besoin d'un objet qui a fait une adresse. De tels objets peuvent apparaître sur la taille gauche d'une cession, d'où le terme L valeur.

Un appel de fonction ne peut pas apparaître à gauche d'une affectation - la valeur de retour est pas une valeur L. C'est pourquoi vous obtenez l'erreur. En C, cela n'a aucun sens de prendre l'adresse de la valeur de retour. (En C ++, vous pouvez retourner des références Dans ce cas, vous peut prendre l'adresse de la valeur de retour Cependant, d'autres valeurs retournées ont les mêmes restrictions que dans C -.. Ils ne sont pas L-valeurs .)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top