【发布时间】:2011-03-19 04:07:20
【问题描述】:
我有一个可用的 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
唯一的问题是我不能将它与函数的返回值一起使用。我收到错误lvalue required as unary '&' operand。我认为这意味着我不能使用这种将 ptr 转换为 uint-ptr 的方法。还有其他有效的方法吗?
编辑:我想提一下,大多数人掩盖的是我希望看到我的值被保留并转换为无符号整数十六进制格式。请注意,您可以将我的宏与左值 float 一起使用,它会吐出正确的大端表示。大多数常规的十六进制转储例程将在写入内存时打印出这些位,这显然取决于字节序。我不清楚我的意思是什么。
无论如何,我最终编写了一组可与 r 值一起使用的重载函数。最后,我真的只是想在 32 位浮点数上使用它。
inline uint32_t tohex(float f) {
uint32_t* u = (uint32_t *)&f; return *u;
}
【问题讨论】:
-
不要这样做。函数是比宏更好的选择。它不会为您购买任何东西来使用宏以及滥用宏的设计用途(它不是功能替换)。
-
函数是的有效方法。你在浪费时间并且不必要地使你的代码复杂化。
-
您可以通过在宏中声明一个用于保存
x值的变量来使其工作,但仅使用函数可能更好。 -
请不要这样做,你只是无缘无故地让你的代码复杂化。
-
没有理由在你的函数中使用
fcpy。取f的地址即可。