#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);