2013-01-22 3 views
1
const struct EbmlSyntax { 
    uint32_t id; 
    EbmlType type; 
    int list_elem_size; 
    int data_offset; 
    union { 
     uint64_t u; 
     double  f; 
     const char *s; 
     const struct EbmlSyntax *n; 
    } def; 
} ; 

Я должен использовать константный-структуру выше и хотите создать аа постоянную используя-структуруКак инициализировать объединение в const struct?

{ EBML_ID_DOCTYPE, EBML_STR, 0, offsetof(Ebml,doctype), {.def.s = "(none)"} }

Но, то VS8.0 компилятор выдаст ошибку об ошибке C2143: синтаксическая ошибка: отсутствует «}» до '.' когда я компилятор проекта C++.

Я попробовал несколько методов, но я только найти способ, закиньте символ * в uint64_t (присвоить первый тип),

(uint64_t)("none") 

и я могу использовать союз. Этот метод безопасен? Я проверяю структуру этого и другого объекта struct-union с помощью инструментов отладки VS. Кажется, что член структуры и объединения может быть правильно израсходован.

+0

Я думаю, что '.' Перед 'def.s' должен быть удален – piwi

+1

У C++ нет указателей (нотация' .def.s = '). C, но только с C99, который Microsoft не поддерживает. – hmjd

+0

Да, вы правы. Я пробовал несколько методов, но, я только нахожу способ, который бросает char * на uint64_t, и я могу использовать объединение. Этот метод безопасен? Кажется, все в порядке. –

ответ

0

Дайте struct конструктор и выполните инициализацию . Конечно, это не статическая инициализация, но если структура не используется до тех пор, пока вы не попадете в main, это не должно быть проблемой .

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

1

Вы можете только инициализировать первый элемент объединения с помощью этого синтаксиса. Вам нужен другой подход.

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