0

我有一个有效的 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; 
}
4

2 回答 2

6

宏应该谨慎使用,因为它们很容易出错,并且难以调试。

在这种情况下,您不会从使用宏中获得任何性能提升,因为像这样的短函数可能会被内联。

通过使用函数,您将获得可读性增益。您还可以从函数中获得许多语言特性,例如重载、类型安全以及将其作为函数指针传递的可能性。您现在可能不需要它们,但将来可能需要它们。

也会更容易写。

总而言之,在这种情况下,函数是一个更好的选择。

此外,在 C++ 和 C 中(如果您需要速度的话),语言中已经内置了一些函数来完成您想要做的事情。

编辑

如果您真的想弄清楚如何使其成为宏,并且想知道为什么这不起作用,请参阅 dappawit 的答案。

于 2011-03-19T04:43:19.793 回答
1

错误消息是说您不能获取返回值的地址,因为它不是 L 值。要获取地址,您需要一个实际具有地址的对象。这样的对象可以出现在赋值的左侧,因此称为 L 值。

函数调用不能出现在赋值的左边——返回值不是左值。这就是您收到错误的原因。在 C 中,获取返回值的地址是没有意义的。(在 C++ 中,您可以返回引用。在这种情况下,您可以获取返回值的地址。但是,其他返回值与 C 中的限制相同——它们不是 L 值。)

于 2011-03-19T04:22:06.823 回答