在C中的宏内转换为非标量错误

时间:2018-09-08 22:23:18

标签: c malloc

我在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

为什么会发生这种情况?请注意,此处不讨论使用实际函数还是使用宏。假设我们对宏感兴趣。为什么会引发上述错误?正确的处理方法是什么?

1 个答案:

答案 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;                  \