我在C语言中有以下测试代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct test {
int a;
int b;
} test_t;
#define test_init(test, a) \
test = (test_t)calloc(1, sizeof(test_t)); \
(test)->a = a; \
(test)->b = (test)->a + 1; \
int main()
{
test_t test;
int a = 5;
test_init(&test, a);
return 0;
}
但是会引发以下错误:
error: conversion to non-scalar type requested
为什么会发生这种情况?请注意,此处不讨论使用实际函数还是使用宏。假设我们对宏感兴趣。为什么会引发上述错误?正确的处理方法是什么?
答案 0 :(得分:3)
回想一下,类似于函数的宏会直接替换其参数。这意味着:
test_init(&test, a);
由预处理器转换为:
&test = (test_t)calloc(1, sizeof(test_t));
(&test)->a = a;
(&test)->b = (&test)->a + 1;
请注意,在第一行中,您尝试为&test
分配内容。 &
运算符的结果不会产生左值。这意味着您无法为&test
分配内容,因为它不代表您可以分配的内容。
要解决此问题,您需要在main中声明test
作为指针:
test_t *test;
int a = 5;
test_init(test, a);
或者,如果您希望将宏传递给类型为test_t
的实例,则无需调用calloc
:
#define test_init(test, a) \
(test).a = a; \
(test).b = (test).a + 1; \