2017-02-18 6 views
1

У меня есть структура, которая может содержать 2 или 4 члена в зависимости от определения препроцессора.Элементы структуры слияния

struct foo { 
    int m1; 
    int m2; 
    #ifdef MORE_MEMBERS 
    int m3; 
    int m4; 
    #endif 
} 

У меня есть функции, которые принимают foo.m3foo.m4 и в качестве аргументов. Из-за этого я получаю ошибку компиляции, когда MORE_MEMBERS не определен.

Я стараюсь избегать добавления #ifdef при каждом вызове функции. Есть ли способ сделать m3 и m4 be aliases/dummies, когда MORE_MEMBERS не определен? Я хотел бы сохранить размер структуры равным sizeof(int) * 2.

+2

Да, измените свой код. Вы используете ужасную картину. Функция должна, возможно, взять параметр strcut foo, но вы не сможете помочь вам, потому что информации недостаточно. Единственное, что довольно ясно, это то, что у вас серьезная проблема с дизайном. –

+0

Это не мой код. Я пытаюсь добавить функцию в чужой код, сделав как можно меньше изменений. Предыдущий код уже имеет функции, которые принимают foo.m1 вместо foo. – devil0150

+1

Какие функции выполняет 'foo.m3' и/или' foo.m4', если 'MORE_MEMBERS' не определен? – cschneid

ответ

0

Я согласен с Iharob, это ужасный код. Не совсем понятно, что вам нужно, но похоже, что вы можете использовать union:

struct foo 
{ 
    int a; 
    int b; 
}; 

union bar 
{ 
    struct foo m1m2; 
    struct foo m3m4; 
}; 

void f(union bar *x) 
{ 
    printf("%d", x->m1m2.a); 
    printf("%d", x->m3m4.b); 
} 
+0

Кажется, что-то вроде этого может работать. Но я не хочу менять вызывающие функции. Могу ли я создавать союзы из {m1, m3} и {m2, m4} в качестве элементов данных, сохраняя их доступными как foo.m1, foo.m3 и т. Д.? – devil0150

+0

Почему вы не хотите изменять вызывающие функции? - Похоже, вы, наверное, должны. Да, союзы могут быть членами структуры. –

+0

Эти функции используются во многих разных местах через код, места, которые не имеют никакого отношения к тому, что я меняю. Если я изменю объявление функции, мне придется также менять вызовы функций. Думаю, я попрошу о программном обеспечении, если я должен сделать функции обертки или использовать союзы. – devil0150

Смежные вопросы