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

C 如何设计包含函数返回值的宏,c,function,macros,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", "cher

为了避免问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获得指向struct apple的ptr,1获得指向struct banana的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;
}
不管我怎么努力,水果名[num]都不会被转换成正确的字符串名, 有没有人能说明我犯了什么错误?
Thx很多

函数参数
num
不可能在宏展开中展开为其值,或者
字符串数组的元素不可能在宏展开中展开为其字符串。这两种方法都需要在预处理器中从未发生过的计算

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

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];
}
或:


这整件事仍然是个XY问题。这里不是100%清楚你想问什么,但是没有意义,所以你的问题是Y部分。通过这些单件和按数字访问,您试图解决的总体问题是什么?(为什么是数字?)您在
DEFSTRUCT
宏(
struct\u name
)中拼错了
struct\u name
)<代码>返回和单件是一个类型错误
get_fruit
没有任何作用:分配给
ptr
是毫无意义的,因为它是一个局部变量(即,当函数返回时被销毁)。您的问题可以通过以下方法解决:
static struct apple_singleton;静态结构香蕉香蕉单体;静态结构cherry\u单态;静态void*const fruit_mapping[]={&apple_singleton,&banana_singleton,&cherry_singleton};void*get_fruit(int n){return fruit_mapping[n];}
注释“苹果、香蕉和樱桃的结构已在上面某处定义,但尚未声明”没有意义。定义就是声明。也许这个注释应该是说
struct
类型已经定义,但是它的apple、banana和cherry实例尚未声明或定义。然而,这在代码的这一点上并不相关,因为下面的代码仅仅声明了一个指向字符串的指针数组;不涉及结构
。谢谢您的回复,但我想问一下在您的第二个示例中“结构名”是什么意思?我不应该改为使用const static void*?因为这三种水果的数据完全不同type@Shih-ChanHuang:
ArrayOfPointers
可以做成一个
void*
的数组,并且
get\u fruit
可以用来返回
void*
。然而,这增加了X-Y问题的迹象。返回一个
void*
对于不知道所指向对象类型的调用者来说基本上是无用的。换句话说,调用者需要知道他们是否有一个
struct apple
、一个
struct banana
,或者其他东西,如果他们要对指针进行任何操作,而不是比较它或将它传递给其他软件。
struct struct_name *get_fruit(void *pointer, int index)
{
    const static struct struct_name *ArrayOfPointers[] =
    {
        &NameOfAppleStructDefinedElsewhere;
        &NameOfBananaStructDefinedElsewhere;
        &NameOfCherryStructDefinedElsewhere;
    };

    return ArrayOfPointers[index];
}