为了防止问一个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]都不会转换为正确的字符串名称, 有谁能说明我犯了什么错误? 非常感谢
答案 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];
}