为什么typedef抛出错误:(S)初始化程序必须是有效的常量表达式

时间:2018-08-13 06:47:52

标签: linux gcc aix xlc

f1.h 标头中

使用typedef进行结构化。如下所示的示例代码片段

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

f2.h 标头中,使用结构 mysturct 获取偏移量。如下所示的代码段

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)Initializer必须是有效的常数表达式”

我尝试了两个宏,但是都遇到了相同的错误。在执行结构的大小以获取偏移量??时,f2.h宏有什么问题吗?

1 个答案:

答案 0 :(得分:2)

所讨论的表达式必须是算术常数表达式才能可移植。这两个宏都不符合条件,因为涉及到指针类型的操作数,并且算术常数表达式受到限制,因此不允许这些操作数。在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