Linux 为什么typedef抛出错误:(S)初始值设定项必须是有效的常量表达式

Linux 为什么typedef抛出错误:(S)初始值设定项必须是有效的常量表达式,linux,gcc,aix,xlc,Linux,Gcc,Aix,Xlc,在f1.h标题中,使用typedef作为结构。下面显示了示例代码段 typedef struct{ int a; union u { int x; char y; }xyz; }mystruct; static mystruct ktt //#define OFFSET_T(b, c) ((int*)((&((mystruct*)0)->b)) - (int*)((&((mystruct*)0)->c

f1.h标题中,使用typedef作为结构。下面显示了示例代码段

typedef struct{
    int a;
    union u
    {
        int x;
        char y;
    }xyz;
}mystruct;
static mystruct ktt

//#define OFFSET_T(b, c) ((int*)((&((mystruct*)0)->b)) - (int*)((&((mystruct*)0)->c)))
#define OFFSET_T(b, c) ((char*) &ktt.b - (char *) &ktt.c)

static struct Mystruct1{
    int n;
}mystruct1 = {OFFSET_T(xyz,a)};
f2.h标头中,使用结构mysturct获取偏移量。代码片段如下所示

typedef struct{
    int a;
    union u
    {
        int x;
        char y;
    }xyz;
}mystruct;
static mystruct ktt

//#define OFFSET_T(b, c) ((int*)((&((mystruct*)0)->b)) - (int*)((&((mystruct*)0)->c)))
#define OFFSET_T(b, c) ((char*) &ktt.b - (char *) &ktt.c)

static struct Mystruct1{
    int n;
}mystruct1 = {OFFSET_T(xyz,a)};
当我使用xlc编译器在AIX机器中进行编译时,它会抛出错误,因为“1506-221(S)初始值设定项必须是有效的常量表达式”


我尝试了两个宏,但都得到了相同的错误。在执行结构大小以获得偏移量时,f2.h宏中是否有任何错误???

所讨论的表达式需要是算术常量表达式才能移植。这两个宏都不合格,因为涉及指针类型的操作数,并且算术常量表达式受到限制,因此不允许使用这些操作数。在C11中,可在第6.6款第8段中找到

也就是说,使用第一个宏(下面复制的源代码)的代码在AIX上的
xlc
编译器的多个版本上编译

typedef struct{
    int a;
    union u
    {
        int x;
        char y;
    }xyz;
}mystruct;

static mystruct ktt;

#define OFFSET_T(b, c) ((int*)((&((mystruct*)0)->b)) - (int*)((&((mystruct*)0)->c)))
//#define OFFSET_T(b, c) ((char*) &ktt.b - (char *) &ktt.c)

static struct Mystruct1{
    int n;
}mystruct1 = {OFFSET_T(xyz,a)};
我使用的编译器调用是:

xlc offsetcalc.c -c -o /dev/null
我尝试的其中一个旧版本的版本信息是:

IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0021
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0004
我尝试的最新版本之一的版本信息是:

IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0021
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0004

所讨论的表达式需要是算术常量表达式才能移植。这两个宏都不合格,因为涉及指针类型的操作数,并且算术常量表达式受到限制,因此不允许使用这些操作数。在C11中,可在第6.6款第8段中找到

也就是说,使用第一个宏(下面复制的源代码)的代码在AIX上的
xlc
编译器的多个版本上编译

typedef struct{
    int a;
    union u
    {
        int x;
        char y;
    }xyz;
}mystruct;

static mystruct ktt;

#define OFFSET_T(b, c) ((int*)((&((mystruct*)0)->b)) - (int*)((&((mystruct*)0)->c)))
//#define OFFSET_T(b, c) ((char*) &ktt.b - (char *) &ktt.c)

static struct Mystruct1{
    int n;
}mystruct1 = {OFFSET_T(xyz,a)};
我使用的编译器调用是:

xlc offsetcalc.c -c -o /dev/null
我尝试的其中一个旧版本的版本信息是:

IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0021
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0004
我尝试的最新版本之一的版本信息是:

IBM XL C/C++ for AIX, V10.1
Version: 10.01.0000.0021
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0004

@Tong,类型铸造未出现问题。在用int*替换char*之后,我也得到了同样的错误。“1506-221(S)初始值设定项必须是有效的常量表达式”。所以我希望问题是在使用typedef访问结构时出现错误。@devipradamarasingu,请说明编译器版本、调用和使用的源代码。尽管有问题标题,typedef与问题正文中提出的问题相当相切。我的回答中描述了宏的两个版本在严格符合程序方面的状态:本质是两个宏都是不可移植的。确实,您询问是否有任何错误,因此,
int*
确实意味着偏移量是以
sizeof(int)
字节为单位计算的(这可能是错误的)。您可能想进一步说明强调“typedef”的原因。@Tong,类型转换并没有出现问题。在用int*替换char*之后,我也得到了同样的错误。“1506-221(S)初始值设定项必须是有效的常量表达式”。所以我希望问题是在使用typedef访问结构时出现错误。@devipradamarasingu,请说明编译器版本、调用和使用的源代码。尽管有问题标题,typedef与问题正文中提出的问题相当相切。我的回答中描述了宏的两个版本在严格符合程序方面的状态:本质是两个宏都是不可移植的。确实,您询问是否有任何错误,因此,
int*
确实意味着偏移量是以
sizeof(int)
字节为单位计算的(这可能是错误的)。您可能想进一步说明强调“typedef”的原因。