Доступ к имени члена структуры в C с помощью макросов

0

У меня есть некоторые проблемы с использованием макросов в C. Мне нужно получить доступ к имени члена структуры. И я нашел решение этого в C++ по этой ссылке ЗДЕСЬ !!! , Теперь я пытаюсь перевести его на C, но я не могу иметь функцию в struct. Это единственное, что я могу сделать:

typedef struct ms ms;
struct ms{
#define SM(y, z) z y;
SM(author, char*);
SM(title, char*);
SM(year, int);
void (*set)(char* fname, char* val);
#undef SM
};

Тогда функция:

void set(char* fname, char* val)
{
   //code
}

Но я не знаю, как мне заполнить код в функции, чтобы получить то же решение, что и ссылка, о которой я упоминал ранее. Мне нужна помощь: (кто-нибудь?

  • 2
    Я бы сказал, что все упомянутое в этой ссылке подпадает под категорию «очень плохая практика, никогда не делай этого». Переизобретать язык программирования с помощью макросов - всегда плохая идея. Он не только невероятно подвержен ошибкам из-за несуществующей безопасности типов, но также является нечитаемым беспорядком для других программистов. Другие программисты знают C, они не знают "частного маленького макроязыка Боба".
  • 0
    Кроме того, если вы знаете только об указателях функций, вы можете достичь my_struct.set_var () гораздо лучше и чище. Или, что еще лучше, проектируйте модули C на основе неполного типа, который по сути является версией C объектно-ориентированного проектирования.
Показать ещё 6 комментариев
Теги:
struct
macros

1 ответ

0

Строки нужно скопировать с помощью strcpy. Таким образом, поле author будет заселено как

struct ms myvar;

#define setstr(author,val) strcpy ( (myvar.author), val )

int можно назначать только регулярно

#define setint(year,val) myvar.year=val
  • 0
    Спасибо, это как-то вдохновляет, но мне нужно получить доступ (в основной функции) к члену по строке. Это как set("author","John"); что-то вроде того.
  • 0
    Затем вам нужно будет изменить макрос, чтобы он распознал, что вы пытаетесь изменить поле "author" а затем измените myvar.author или любое другое поле, которое вы пытаетесь использовать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню