如何设计宏以包含函数返回值

时间:2018-09-16 10:24:37

标签: c function macros

为了防止问一个X-Y问题,我想先描述一下我的意图。有很多自定义结构,它们都是静态单例变量。我想设计一个宏(或函数)来获得我想要的特定地址。到目前为止,这是我所做的:

/* the struct of apple, banana and cherry have been defined somewhere above
 * BUT NOT YET DECLARED */

const char *fruit_name[3] = {
    "apple",
    "banana",
    "cherry"
};

我期望的是,用户只需提供数字就可以获取指向struct的指针,即0可以将ptr构造为apple,1可以将ptr构造为香蕉,依此类推。

我通过以下方式声明静态变量:

#define DEFSTRUCT(struct_name) \
    static struct struct_name my##struct_name(void)  \
    { \
        static struct strcut_name singleton;  \
        return &singleton; \
    }

然后我用它来生成3个函数,这些函数将返回指向结构的指针:

DEFSTRUCT(apple)    // whenever calls myapple() I got the reference to static struct apple 
DEFSTRUCT(banana)
DEFSTRUCT(cherry)

这是最令人沮丧的部分,我无法创建宏(或函数)来传输字符串以访问它们

这是我的工作,但徒劳无功:

#define GETSTRUCT(struct_name) my##struct_name()

void get_fruit(void *ptr, int num) {
    ptr = GETSTRUCT(fruit_name[num]);  // I expect that ptr would points to static struct apple if num is 0;
}

无论我怎么努力,fruit_name [num]都不会转换为正确的字符串名称, 有谁能说明我犯了什么错误? 非常感谢

1 个答案:

答案 0 :(得分:1)

在宏扩展中无法将函数参数num扩展为其值,而在宏扩展中不能将strings数组的元素扩展为其字符串。两者都需要评估,这在预处理器中永远不会发生。

返回指向结构的指针的函数可以是:

struct struct_name *get_fruit(void *pointer, int index)
{
    static struct struct_name ArrayOfTheseThings[] =
    {
        { contents of "apple" struct },
        { contents of "banana" struct },
        { contents of "cherry" struct },
    };

    return &ArrayOfTheseThings[index];
}

或:

struct struct_name *get_fruit(void *pointer, int index)
{
    const static struct struct_name *ArrayOfPointers[] =
    {
        &NameOfAppleStructDefinedElsewhere;
        &NameOfBananaStructDefinedElsewhere;
        &NameOfCherryStructDefinedElsewhere;
    };

    return ArrayOfPointers[index];
}