gpt4 book ai didi

c - -Win兼容指针类型和枚举

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:31 27 4
gpt4 key购买 nike

short*int* 的隐式转换打印关于不兼容指针类型的警告(我明白为什么)。

enum*int* 的隐式转换打印相同的警告。

有一个工具snacc可以生成如下代码:

typedef enum
{
CHARGINGCALLING = 0,
CHARGINGCALLED = 1,
NONECHARGING = 2
} ChargedParty; /* ENUMERATED { CHARGINGCALLING (0), CHARGINGCALLED (1), NONECHARGING (2) } */

typedef struct MSOriginatingSMSinSMS_IWMSC /* SET */
{
ChargedParty* chargedParty; /* [6] IMPLICIT ChargedParty OPTIONAL */
} MSOriginatingSMSinSMS_IWMSC;

#define BEncChargedPartyContent BEncAsnEnumContent

int BEncMSOriginatingSMSinSMS_IWMSCContent (BUF_TYPE b, MSOriginatingSMSinSMS_IWMSC *v) {
BEncChargedPartyContent (b, (v->chargedParty));
...
}

此工具附带的头文件:

int BEncAsnIntContent (BUF_TYPE b, int *data);
#define BEncAsnEnumContent BEncAsnIntContent

调用 BEncChargedPartyContent 打印警告。

我能否修改 BEncAsnEnumContent 的声明,使其在没有警告的情况下接受指向任何 枚举的指针,但不接受 void*短*?

当然,使用 sed 我可以用静态函数替换宏 BEncChargedPartyContent:

static AsnLen BEncChargedPartyContent (BUF_TYPE b, ChargedParty *data)
{
return BEncAsnEnumContent(b, (int*)data);
}

但是他们太多了。

最佳答案

您自己的带有静态函数的建议听起来还不错。

Can I modify the declaration of BEncAsnEnumContent so it accepts without a warning pointers to any enum, but not void* or short*?

如果需要,您可以使用 John Zwinck 所暗示的静态断言。

#define BEncAsnEnumContent(b, d)        ({\
_Static_assert(sizeof(int) == sizeof *(d), "wrong data size");\
BEncAsnIntContent(b, (int *)d); })

您在下面的评论中想到的是一个可行的替代方案,其优点是它允许不同大小的枚举;这就是我理解你的意思的方式:

#define BEncAsnEnumContent(b, d)    MyEncAsnEnumContent(b, *(d))
static int MyEncAsnEnumContent(BUF_TYPE b, int val)
{
return BEncAsnIntContent(b, &val);
}

关于c - -Win兼容指针类型和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com