Вопрос по c, runtime, structure – Как я могу получить количество членов в структуре?

0

Я хочу посчитать количество членов в структуре. Например:

typedef struct
{
    char    MrChar;
    int MrInt;
    long    MrLong;
} Bg_Typedef;
Bg_Typedef FooStr;

Я создаю прототип функции, который должен возвращать количество членов в структуре

int NumberOfMem(Bg_Typedef *psStructure); 

= & GT; NumberOfMem (& FooStr) должен возвращать 3

Я не думаю, что вы можете сделать это. Кстати, каков ваш алгоритм для достижения этой цели? Rohan
@Rohan: Это именно Q OP спрашивает (How do I get the number of members in a structure?) Alok Save

Ваш Ответ

4   ответа
2

которое требуется структуре (включая байты заполнения), используяsizeof оператор. Пока все члены структуры имеют одинаковый тип, вы можете использоватьsizeof(struct foo)/sizeof(membertype) рассчитать количество членов. В общем случае с типами элементов разного размера это невозможно изнутри языка C (вы можете автоматически обработать исходный код и заполнить результат, но это уродливо). С просто не позволяет то, что называетсяIntrospection на других языках (например, Perl).

Но тогда вы (и компилятор) знаете количество членов вcompile time. Why do you want to compute a known number at runtime? Возможно, вы можете указать реальную проблему, которую вы пытаетесь решить, и мы можем указать на решение, не включающее подсчет участников ...

2

ать это, вам нужно запомнить количество членов или жесткий код числа как возвращаемое значение вашей функции. C может сказать вам размер в байтах ваших структур, но не количество членов, которые они содержат. В качестве альтернативы вы можете использовать функцию-член вашей структуры, чтобы вернуть жестко закодированное число членов.

2

X_MACRO& APOS; с.

Сделайте что-то вроде этого:

#define X_BG_MEMBERS \
    X(char, MrChar) \
    X(int, MrInt) \
    X(long, MrLong)

typedef struct {
#define X(type, member) type member;
    X_BG_MEMBERS
#undef X
} Bg_Typedef;

Bg_Typedef FooStr;

Определите функцию, которая будет считать членов. Также может быть просто переменной, но сделать переменнуюstatic const чтобы оно не перезаписывалось

static int
bg_members_count() {
    #define X(_, __) +1
    static int COUNT = 0
    X_BG_MEMBERS;
    #undef X

    return COUNT;
}

Теперь вы можете сделать что-то вроде этого в основном:

#include <stdio.h>
...

int main() {
    printf("The number of members defined in Bg_Typedef is %d\n", bg_members_count());
}

Вы должны получить что-то вроде:

The number of members defined in Bg_Typedef is 3

Вы также можете просто хотеть константу, поэтому вы можете сделать следующее

#define X(_, __) +1
static const int COUNT = X_BG_MEMBERS;
#undef X
1

Если вам это действительно нужно, вы должны попробовать язык более высокого уровня, который поддерживает рефлексию. (Java, Python).

http://en.wikipedia.org/wiki/Reflection_%28computer_programming%29

Похожие вопросы