I have a working hexdump function but it seems to be overkill for printing a single variable. So I am trying to make a macro for it. So far this works almost perfectly:
#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
The only issue with this is that I cannot use it with the return value of a function. I get the error lvalue required as unary '&' operand
. I think this means that I can't use this method of casting ptr to uint-ptr. Is there another efficient way to do this?
Edit: I'd like to mention that what most people glossed over is that I wanted to see my value bit-preserved and converted to an unsigned int hexadecimal format. Note that you may use my macro with an l-value float
and it spits out the correct big-endian representation. Most regular hex-dump routines will print out the bits as it is written in memory, which clearly is dependent on endianness. My bad for not being clear about what I meant.
Anyway, I ended up writing a set of overloaded functions which can be used with an r-value. In the end I only really just wanted to use it on 32-bit floats.
inline uint32_t tohex(float f) {
uint32_t* u = (uint32_t *)&f; return *u;
}
Macros should be used sparingly because they are highly bug prone, and difficult to debug.
In this case, you won't get any performance gain from using a macro, because a short function like this is probably going to get inlined.
You will get a readability gain by using a function. There are also many language features you get from functions, such as overloading, type safety, and potential to pass it as a function pointer. You may not need them now, but you might in the future.
It will also be easier to write.
All in all, a function is a much much better choice in this case.
Plus there are already functions built into the language to do what you're trying to do, both in C++, and in C (if you need the speed).
Edit
If you really want to figure out how to make it a macro, and want to know why this doesn't work, see dappawit's answer.