Как получить имя поля структуры в виде строки в Си?

Есть какая-то структура

typedef struct someStruct
{
    uint8_t someField;
    uint8_t anotherField;
}someStruct_t;

Нужно получить строку которая будет соответствовать имени поля этой структуры. Например:

char field_name [] = SOME_MACRO(someStruct_t.someField); // Нужно получить строку "someField"

Возможно ли это реализовать средствами языка С (cтандарт C99)?


Ответы (2 шт):

Автор решения: Qwertiy

На Си++ можно так:

#define FIELD_NAME(s,f) (sizeof(s::f), #f)

если не компилируется, то версия для Си:

#define FIELD_NAME(s,f) (sizeof(((s*)0)->f), #f)

В обоих случаях использовать так:

const char *name = FIELD_NAME(someStruct_t, someField);

Если написать несуществующее имя поля, то не скомпилируется.

Код на Си полностью

#include <stdio.h>
#include <stdint.h>

typedef struct someStruct
{
    uint8_t someField;
    uint8_t anotherField;
} someStruct_t;

#define FIELD_NAME(s,f) (sizeof(((s*)0)->f), #f)

int main()
{
  const char *name = FIELD_NAME(someStruct_t, someField);
  puts(name);
  return 0;
}

Код на Си++ полностью

#include <stdio.h>
#include <stdint.h>

typedef struct someStruct
{
    uint8_t someField;
    uint8_t anotherField;
} someStruct_t;

#define FIELD_NAME(s,f) (sizeof(s::f), #f)

int main()
{
  const char *name = FIELD_NAME(someStruct_t, someField);
  puts(name);
  return 0;
}
→ Ссылка