Как присвоить значение union в VC ++ - PullRequest
0 голосов
/ 14 мая 2018

Существует union в C и встроенный в C ++, как показано ниже:

typedef union MyUnion MyUnion_;
union MyUnion{
    ULONG   mLong;
    char    mChar;
...
};

Когда я пытаюсь инициировать это как:

MyUnion_ test;
test = (MyUnion_)NULL;

это может быть скомпилировано Mingw32, но дает

error: C2440: 'type cast': cannot convert from 'void *' to 'MyUnion_'

в VC ++ (VS2015). Так как же выполнить приведение и инициализацию union в компиляторе VC ++?

Теперь я делаю так:

MyUnion_ test;
test.mLong = NULL;

но это делает программу плохой при передаче union в качестве параметра.

void test(MyUnion_ u)

ULONG i = 0;

// mingw32
test((MyUnion_)i);

// vc++
MyUnion_ temp;
temp.mLong = i;
test(temp);

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Используя компилятор, который поддерживает унифицированный синтаксис инициализации C ++ 11, вы можете использовать инициализированный скобками инициализатор с одним значением, которое будет использоваться для инициализации первого нестатического поля объединения…

MyUnion test{ 0 };

Вы могли бы использовать NULL вместо нуля в приведенном выше коде, но кажется неясным инициализировать mLong (то есть ULONG) с NULL.

Вы также можете использовать фигурную инициализацию воператор присваивания, если вам нужно установить переменную после того, как она была объявлена…

MyUnion test{ 0 };

// ...

test = { 3 };

Обратите внимание, что синтаксис фигурных скобок инициализатора также может быть доступен в более старых компиляторах, которые предлагают экспериментальную поддержку того, что раньше называлось C++ 0x

Visual Studio 2015 C ++ поддерживает фигурные инициализаторы, если вы не компилируете файл с расширением .c или не используете переключатель /TC для компиляции в виде кода C (а не код C ++).

Старые компиляторы C ++ (и C)

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

MyUnion_ test = { 0 };

… Но не в операторах присваивания.

Приведение к типу объединения

Согласно этой статье Центра знаний IBM приведение к типу объединения является расширением C99 "... реализовано для облегчения переноса программ, разработанных с использованием GNU C ", что предполагает, что это не стандартная C.

. Эта документация Microsoft указывает, что для C нет законных приведений в C *1039*.объединение, структура или массив.

В C ++ приведение к типу объединения возможно, если существует подходящий конструктор ...

union MyUnion {
   unsigned long   mLong;
   char            mChar;

   MyUnion(unsigned long val) { mLong = val; };
};


// valid cast 
test = (MyUnion)3ul;

// invalid cast - no suitable constructor exists
void * ptr = 0;
test = (MyUnion)ptr;
0 голосов
/ 14 мая 2018

Конструктор по умолчанию?

typedef union MyUnion MyUnion_;
union MyUnion {
    ULONG   mLong;
    char    mChar;
    MyUnion(): mLong(0) {}
};

int main()
{
    MyUnion_ temp;
    return 0;
}
...