Директива объявления статической структуры C

#c #struct #preprocessor

#c #структура #препроцессор

Вопрос:

Я пытаюсь объявить статическую структуру C. Объявление структуры выглядит следующим образом:

 typedef struct {
    int a;
    int b;
    int c
}dummy_struct;
  

Однако при определении структуры я хочу сохранить значение в c, которое вычисляется с использованием значений в a и b и другого постоянного значения.

Моя первоначальная идея заключалась в том, чтобы сохранить ее таким образом:

 static dummy_struct dummy = 
{
    .a = 5,
    .b = 10,
    .c = CALC_VALUE(0.5, a, b)
}
  

И затем я бы определил CALC_VALUE как препроцессор, чтобы я мог выполнить некоторые вычисления для a, b и постоянного значения следующим образом:

 #define CALC_VALUE(constant, a, b) (constant * (a/2) * (b*3))
  

Но мой компилятор жалуется каждый раз, когда я делаю это, поэтому я прибегаю к следующему методу для объявления:

 static dummy_struct dummy = 
{
    .a = 5,
    .b = 10,
    .c = CALC_VALUE(0.5, 5, 10)
}

  

Есть ли более чистый способ сделать это без использования #defines для ‘a’ и ‘b’

Комментарии:

1. Почему бы просто не сохранить 0.5 в структуре, а затем выполнить вычисление там, где вам нужно значение?

2. Члены структуры не являются переменными, к ним нельзя получить доступ без ссылки на переменную, содержащую структуру.

3. И вы можете использовать только литералы и постоянные выражения при инициализации статической переменной.

4. @JosephSible-RestorateMonica Проблема заключается не в сохранении 0.5, а в возможности доступа к значению в a и b из объявления структуры. Я не против использовать #define для 0.5, но я хочу иметь возможность доступа к a и b, поскольку они оба уже определены для элемента struct . Итак, мне было интересно, есть ли способ получить доступ к значению, хранящемуся в локальном элементе. Если вы посмотрите на мой второй фрагмент кода, я хочу иметь возможность делать что-то подобное.

5. @Barmar Ok понял. Я думаю, это ограничение, которое я пытаюсь преодолеть.

Ответ №1:

Используйте макрос для генерации всего начального значения структуры.

 #define CALC_VALUE(constant, a_val, b_val) { 
    .a = (a_val), 
    .b = (b_val), 
    .c = ((constant) * ((a_val)/2) * ((b_val)*3)) 
}
  

Затем вы можете сделать:

 static dummy_struct dummy = CALC_VALUE(0.5, 5, 10);