gpt4 book ai didi

c - 为什么这个宏没有正确扩展?

转载 作者:太空狗 更新时间:2023-10-29 15:28:34 25 4
gpt4 key购买 nike

我正在尝试按如下方式初始化数组:

   static tha_field_info_t person_t_fields[] = {
HA_FIELD_INFO(person_t, name, CHAR)
};

相关数据结构:

typedef struct _tha_field_info_{
char fname[128];
DATA_TYPE_t dtype;
unsigned int size;
unsigned int offset;
} tha_field_info_t;

typedef struct _person{
char name[30];
unsigned int age;
} person_t;

使用的宏

#define HA_FIELD_OFFSET(st, name)       ((int)&((st *)0)->name)
#define HA_FIELD_SIZE(st, name) sizeof (((st *)0)->name)

#define HA_FIELD_INFO (st, fname, dtype) \
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}

看到这个宏的编译错误。

tha.h:35:28: error: ‘fname’ undeclared (first use in this function)
tha.h:35:35: error: ‘dtype’ undeclared (first use in this function)
tha.h:36:2: error: expected ‘}’ before ‘{’ token
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}
tha.h:36:3: error: stray ‘#’ in program
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}

但是,如果我像这样硬编码,那么它工作正常。

{"name", CHAR, sizeof(((person_t *)0)->name), ((int)&((person_t *)0)->name)}

基本上,我想存储结构person_t字段信息的数组。

最佳答案

C语言中有两种定义指令:

#define OBJECT_LIKE_MACRO     followed by a "replacement list" of preprocessor tokens
#define FUNCTION_LIKE_MACRO(with, arguments) followed by a replacement list

区分这两种宏的是 #define 之后标识符后面的标记:如果它是一个 lparen,它就是一个类函数宏,否则它是一个类似对象的宏。什么是lparenDraft N1570在附录 A 第 3 节中指出:

(6.10) lparen:
  a ( character not immediately preceded by white-space

据我所知,这是 C 中为数不多的间距很重要的情况之一(除了 // 注释、行拼接和预处理指令)。这有点道理。毕竟,预处理器将如何区分任何类似函数的宏和具有以 ( 标记开头的替换列表的类似对象的宏?例如,以下是一个类似对象的宏,而不是语法错误的类似函数的宏:

#define NULL (void*)0

现在让我们回答您的问题。问题出在这两行:

#define HA_FIELD_INFO (st, fname, dtype)   \
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}

因为 HA_FIELD_INFO 之后的 ( 字符“前面有空格”,这不是您想要的类似函数的宏。只需删除它空间:

#define HA_FIELD_INFO(st, fname, dtype)   \
{#fname, dtype, HA_FIELD_SIZE(st, fname), HA_FIELD_OFFSET(st, fname)}

关于c - 为什么这个宏没有正确扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39931709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com