使用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宏有什么问题吗?
答案 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