Совместимость между 2 структурами - PullRequest
2 голосов
/ 06 сентября 2011

Хотелось бы просто использовать препроцессор, но ввод поступает во время выполнения ... Я попробовал условный typedef, не работает Или условное объявление, не работает. Хотя я не ожидал, что они тоже. И поскольку весь следующий код является точно таким же, я не хочу переписывать его дважды ... один раз для каждой структуры.

Есть ли способ сделать это в C? Или другой подход, с тем же результатом. Все мои поиски в Google привели меня к шаблонам C ++. Если мне неясно, может быть, это поможет:

#include <stdio.h>

struct a32 {
    short bits;
    unsigned long val;
    // more values, not necessarily in the same order
};

struct a64 {
    short bits;
    unsigned long long val;
    // etc...
};

int main(void) {
    struct a32 mystruct;

    // read mystruct from somewhere

    if(mystruct.bits == 64) {
        // then I need mystruct to be a64
        // re-read mystruct
    }

    // exact same code for both structs

    printf("%d\n", sizeof(mystruct.val));
    return 0;
}

Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

Почему бы не сделать что-то подобное, предполагая, что заполнение не будет проблемой:

struct {
    unsigned long val;
} a32;

struct {
    unsigned long long val;
} a64;

int main(void) {
    short bits;
    union {
        struct a32 struct32;
        struct a64 struct64;
    };

    // Read bits

    if (bits == 64) {
        // Read into struct64
    } else {
        // Read into struct32
    }

    return 0;
}

Это, конечно, потребует, чтобы вы знали о значении bits, чтобы вы знали, к какой структурной переменной обращаться.

2 голосов
/ 06 сентября 2011

Вы можете сделать это "sorta", используя объединения:

struct{
    short bits;
    union{
        unsigned long a32;
        unsigned long long a64;
    };
} a_int;

int main(void) {
    a_int mystruct;

    // read mystruct from somewhere

    if(mystruct.bits == 64) {
        // then I need mystruct to be a64
        // re-read mystruct
    }

    // exact same code for both structs

    printf("%d\n", sizeof(mystruct.a32));
    return 0;
}

РЕДАКТИРОВАТЬ: Однако невозможно заставить printf() работать как для 32-битных, так и для 64-битных целых чисел.

1 голос
/ 06 сентября 2011

Не на 100% уверен, что вы это имеете в виду.Если нет, пожалуйста, уточните вопрос.

Вы должны использовать помеченный союз.Создайте структуру с тегом (например, int) и объединением.Объединение находится между возможными структурами, которыми это может быть, и тегом указывает, какой именно он является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...