从short*
到int*
的隐式强制转换将打印关于不兼容指针类型的警告(我理解原因)。
从enum*
到int*
的隐式转换将打印相同的警告。
有一个工具可以生成以下代码:
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
调用
snacc
将打印警告。我是否可以修改
BEncChargedPartyContent
的声明,以便它在没有指向任何枚举的警告指针的情况下接受,而不是BEncAsnEnumContent
或void*
?当然,使用
short*
我可以用静态函数替换宏sed
:static AsnLen BEncChargedPartyContent (BUF_TYPE b, ChargedParty *data)
{
return BEncAsnEnumContent(b, (int*)data);
}
但是他们太多了。
最佳答案
你自己提出的带有静态函数的建议听起来还不错。
我可以修改BEncAsnEnumContent
的声明吗
接受,但不接受指向任何枚举的警告指针void*
或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);
}