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) { ... }