У меня есть структура с вложенным объединением в c ++, как показано ниже:
typedef enum {
VAL_BOOL,
VAL_NIL,
VAL_NUMBER,
} ValueType;
typedef struct {
ValueType type;
union {
bool boolean;
double number;
} as;
} Value;
Я пытаюсь построить функцию #define
, чтобы сделать инициализацию этих значений более читабельной, и это то, что у меня естьдо сих пор, но не компилируется:
#define NUMBER_VAL(value) ((Value){ VAL_NUMBER, { .number = value } })
При использовании NUMBER_VAL(val)
приведенная выше реализация генерирует следующую ошибку: expected an expression
Цель здесьчтобы иметь возможность определить Value
, написав что-то вроде следующего:
double dub = 1.23;
Value val = NUMBER_VAL(dub);
или передать его функции, например, так:
void process_value(Value value);
...
double dub = 45.6;
process_value(NUMBER_VAL(dub));
Есть ли какой-то способпреобразовать это #define
-ition в выражение, которое позволило бы мне использовать его таким образом?Или я могу здесь написать единственную функцию для создания этих структур для меня?
Для протокола, я знаю, что сработает следующее, но я надеялся на что-то более лаконичное.
Value NUMBER_VAL(double value) {
Value val;
val.type = VAL_NUMBER;
val.as.number = value;
return val;
}