C错误:在访问结构中的联合成员时,表达式必须具有算术或指针类型
获取错误C错误:在访问结构中的联合成员时,表达式必须具有算术或指针类型,c,C,获取错误错误:表达式在以下代码段中必须具有算术或指针类型。不知道出了什么问题 struct structX { union { structA varA; /* structA is a structure */ structB varB; /* structB is a structure */ } unionX; #define xa unionX.varA #define xb unionX.varB } void foo(structX **sxpp) {
错误:表达式在以下代码段中必须具有算术或指针类型。不知道出了什么问题
struct structX
{
union {
structA varA; /* structA is a structure */
structB varB; /* structB is a structure */
} unionX;
#define xa unionX.varA
#define xb unionX.varB
}
void foo(structX **sxpp) {
structX *sxp = *sxpp;
/* i want to do null check for xb */
if (sxp-> xb) /* error: expression must have arithmetic or pointer type */
{
...
}
}
我也试着遵从指针,类似这样,但没有成功
if ((**sxpp).xb)
下面陈述中的问题
structX *sxp = *sxpp;
它应该是structStructX*sxp=*sxpp代码>
或者首先typedef
typedef struct structX
{
union {
/* make sure below structure are typedefed above */
structA varA; /* structA is a structure */
structB varB; /* structB is a structure */
} unionX;
}structX;
然后将变量创建为
structX *sxp = *sxpp;
相应地修改foo
函数
void foo(structX **sxpp) { ... } /* if typedefed */
或
编辑:因为您的问题没有解释structA
和structB
。让我们假设structB
看起来像
typedef struct struct_b {
int y;
}structB;
代码块
if (sxp->xb) {
...
}
如果要检查structB
的成员是否为NULL
,则应小于1
if (sxp->xb.y) { /* let say y is data member of structB */
...
}
在本声明中:
if (sxp-> xb) { ... }
您试图将结构(sxp->unionX.varB
)计算为true或false。您的编译器试图告诉您这将不起作用。if()
语句中的表达式必须是算术值(例如,if(i<10)
,其中i<10
的计算结果为0或1),或者是指针(例如,f=fopen(“a.txt”,“r”);if(f){…
)
不能以这种方式计算结构。您可能是想检查此联合内varB
元素的值吗?它应该是(struct structX**sxpp)
等等。您不能只从类型名称中删除struct
。“我想对xb执行空检查”什么是structB
的类型?如果它不是指针(我希望它不是指针,因为指针不应该隐藏在typedef后面),那么执行空检查就没有意义。当修复到处缺少struct
的问题时,代码编译得很好。因此,问题似乎不在发布的代码中。顺便说一句,如果你把编译器升级到标准C,你就不需要使用像这样难闻的宏。标准C支持匿名结构/联合。如果structB
是类型定义的结构,则不能在条件中简单地使用它。您需要使用结构的一个成员。是否在出现错误的代码段中看到注释?这显然不是关于缺少struct
关键字。我修改了@Gerhardh
if (sxp-> xb) { ... }