Чтобы не задавать проблему XY, сначала я хотел бы описать свое намерение.Существует много самоопределенных структур, все они являются статическими одноэлементными переменными .Я хотел бы разработать макрос (или функцию), чтобы получить конкретный адрес к тому, что я хочу.Вот что я делаю до сих пор:
/* the struct of apple, banana and cherry have been defined somewhere above
* BUT NOT YET DECLARED */
const char *fruit_name[3] = {
"apple",
"banana",
"cherry"
};
Я ожидал, что пользователь сможет получить указатель на структуру просто, предложив число, то есть 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] НЕ БУДЕТ перенесено в правильное имя строки. Кто-нибудь может указать, какую ошибку я допустил?Огромное спасибо