Ste*_* Lu 0 c c++ macros hexdump
我有一个有效的hexdump函数,但打印单个变量似乎有点过分.所以我想为它制作一个宏.到目前为止,这几乎完美:
#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
Run Code Online (Sandbox Code Playgroud)
唯一的问题是我不能将它与函数的返回值一起使用.我收到了错误lvalue required as unary '&' operand
.我认为这意味着我不能使用这种方法将ptr转换为uint-ptr.还有另一种有效的方法吗?
编辑:我想提一提的是,大多数人掩盖的是,我想看看我的价值位保留,并转换为unsigned int类型十六进制格式.请注意,您可以使用具有l值的宏,float
并且它会吐出正确的big-endian表示.大多数常规的十六进制转储例程会在写入内存时打印出这些位,这显然取决于字节顺序.我不清楚我的意思是不好的.
无论如何,我最终编写了一组可以与r值一起使用的重载函数.最后我只想在32位浮点数上使用它.
inline uint32_t tohex(float f) {
uint32_t* u = (uint32_t *)&f; return *u;
}
Run Code Online (Sandbox Code Playgroud)
应该谨慎使用宏,因为它们容易出错,并且难以调试.
在这种情况下,使用宏不会获得任何性能提升,因为像这样的短函数可能会被内联.
通过使用函数,您将获得可读性增益.您还可以从函数中获得许多语言功能,例如重载,类型安全性以及将其作为函数指针传递的潜力.你现在可能不需要它们,但将来你可能也不需要它们.
写起来也会更容易.
总而言之,在这种情况下,函数是一个更好的选择.
此外,在C++和C语言中(如果你需要速度),已经有语言内置的函数来完成你正在尝试做的事情.
编辑
如果你真的想弄清楚如何使它成为一个宏,并想知道为什么这不起作用,请参阅dappawit的答案.