“подайте единственную заявку экземпляра”, что это делает?

Один случай, когда reinterpret_cast необходимо, при взаимодействии через интерфейс с непрозрачными типами данных. Это часто происходит в API поставщика, над которыми программист не имеет никакого контроля. Вот изобретенный пример, где поставщик обеспечивает API для того, чтобы сохранить и получить произвольные глобальные данные:

// vendor.hpp
typedef struct _Opaque * VendorGlobalUserData;
void VendorSetUserData(VendorGlobalUserData p);
VendorGlobalUserData VendorGetUserData();

Для использования этого API программист должен бросить их данные к VendorGlobalUserData и назад снова. static_cast не будет работать, нужно использовать reinterpret_cast:

// main.cpp
#include "vendor.hpp"
#include <iostream>
using namespace std;

struct MyUserData {
    MyUserData() : m(42) {}
    int m;
};

int main() {
    MyUserData u;

        // store global data
    VendorGlobalUserData d1;
//  d1 = &u;                                          // compile error
//  d1 = static_cast<VendorGlobalUserData>(&u);       // compile error
    d1 = reinterpret_cast<VendorGlobalUserData>(&u);  // ok
    VendorSetUserData(d1);

        // do other stuff...

        // retrieve global data
    VendorGlobalUserData d2 = VendorGetUserData();
    MyUserData * p = 0;
//  p = d2;                                           // compile error
//  p = static_cast<MyUserData *>(d2);                // compile error
    p = reinterpret_cast<MyUserData *>(d2);           // ok

    if (p) { cout << p->m << endl; }
    return 0;
}

Ниже изобретенная реализация демонстрационного API:

// vendor.cpp
static VendorGlobalUserData g = 0;
void VendorSetUserData(VendorGlobalUserData p) { g = p; }
VendorGlobalUserData VendorGetUserData() { return g; }
9
задан skaffman 29 July 2011 в 12:49
поделиться

3 ответа

делает ли это так, что невозможно открыть два экземпляра одновременно?

Да.

18
ответ дан 4 December 2019 в 06:16
поделиться

Да, это делает невозможным открытие двух экземпляров одновременно.

Однако очень важно знать об ошибках . С некоторыми брандмауэрами невозможно открыть даже один экземпляр - ваше приложение вылетает при запуске! См. прекрасную статью Билла Маккарти для получения дополнительных сведений и техники ограничения вашего приложения одним экземпляром. Его метод передачи аргумента командной строки из второго экземпляра обратно в первый использует конвейеры в .NET 3.5.

11
ответ дан 4 December 2019 в 06:16
поделиться

Да, вы правы в том, что это позволит открывать только один экземпляр вашего приложения за раз.

1
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: