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的声明,以便它在没有指向任何枚举的警告指针的情况下接受,而不是BEncAsnEnumContentvoid*
当然,使用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);
}

07-24 09:37
查看更多