C ++ Ожидается выражение при определении структуры с вложенным объединением - PullRequest
1 голос
/ 10 апреля 2019

У меня есть структура с вложенным объединением в 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;
}

1 Ответ

1 голос
/ 10 апреля 2019

Живой код .

В C ++ объединения могут иметь конструкторы. В вашем struct вы можете определить перегрузки конструктора для инициализации члена объединения вместе с тегом объединения, т.е. type.

...