您如何获取C语言中一个倒置复合垃圾的地址?

问题描述

我不确定该问题应该使用什么标题,但我会尝试通过解释加以澄清:

所以它的长短是我想要一个函数参数接受一个数组和同一参数的整数。不太难,只需使用指针吧?所以我有这个:

#define BIT0 (unsigned char){0b00000001}

void    foo (unsigned char *ptr_bar)
{
    printf("%x",*ptr_bar);
}

void    main    (void)
{
    foo(&BIT0);
}

可以正常工作,而且花花公子可以正常使用一个值,但就我而言,我需要能够反转该值,所以我认为这可以工作:

#define BIT0 (unsigned char){0b00000001}

void    foo (unsigned char *ptr_bar)
{
    printf("%x",*ptr_bar);
}

void    main    (void)
{
    foo(&~BIT0);
}

在传递值时,只需将其用按位NOT(〜)反转即可。没有大佬吧?好吧,我得到了错误

error: lvalue required as unary '&' operand

如果我将其重写为:

#define BIT0 (unsigned char){0b00000001}

void    foo (unsigned char *ptr_bar)
{
    printf("%x",*ptr_bar);
}

void    main    (void)
{
    foo(&(unsigned char){~BIT0});
}

首先,这是一个非常丑陋的解决方案,我真的不想在我的代码中使用它。一点都不直观。 其次,它可以按照我最初希望的方式工作,但是我相信这是在告诉我,'〜'运算符正在将未签名的char提升为未签名的int。因此,为了使该函数能够接受地址,我必须将其强制转换回无符号字符。但是错误消息与使我感到困惑的消息并不完全匹配。

这是怎么回事?如何解决此问题以获得所需的行为?

解决方法

该错误的原因是某些运算符(如一元*)返回了所谓的可修改的 lvalue ,表示对可以更改的对象的引用。但是,大多数运算符都不执行此操作,而~就是这样的运算符。您从中得到的只是一个临时的只读值。实际上,它的确也将操作数提升为签名的int,这通常是有问题的,但不是导致错误的原因。

至于如何解决问题,则在于如何使用这些宏。如果BIT0是一个设置为0的复合文字,那么为了始终如一,可能会创建一个类似的宏:

#define BITS1_7 (unsigned char){0xFE}

(请注意,二进制文字不是标准的C。)

但是我也不会那样做。问题的根源在于过度设计并坚持以奇怪的方式使用复合文字。而是应用KISS principle。如果您有一个接受单个字节或数组的函数,那么编写程序的最易读方法是:

#define BIT0 (1u << 0) // industry de facto standard way to write a bit mask
...

uint8_t tmp = BIT0;
foo(&tmp);

或者

uint8_t tmp = ~BIT0;

所有C程序员都可以阅读和理解此代码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...