0

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)};

当我在AIX机器上使用xlc编译器进行编译时,它会抛出错误,因为“1506-221(S) Initializer must be a valid constant expression”

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

4

1 回答 1

2

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

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

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
于 2018-08-13T15:55:41.910 回答