Безопасно ли использовать перечисляемые параметры и возвращаемые значения в SDK API? - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу создать SDK, состоящий из заголовочного файла sdk.h с открытым API и скомпилированной DLL с реализацией.

If the code looks like:
//////////
// sdk.h
//////////

enum eAction
{
    Action1,
    Action2,
    Action3
};


class Item
{
protected:
    virtual ~Item(){}
public:
    virtual void Do(eAction action) = 0;
    virtual  void Release()  = 0;
};

extern "C"
{
    Item * CreateItem();
}


//////////
// sdk.cpp
//////////

class ItemImpl: public Item
{
public:

    virtual void Do(eAction action)
    {
        printf("%d", (int)action);
        // do something
    }

    virtual  void Release()
    {
        delete this;
    }
};


Item * CreateItem()
{
    return new ItemImpl;
}


//////////
// main.cpp client side
//////////

int main(int argc, char* argv[])
{
    Item *pItem = CreateItem();

    pItem->Do(Action1);

    pItem->Release();

    return 0;
}

// The file sdk.h is the public API.
// The file sdk.cpp is the implementation and it is compiled to sdk.dll.
// The file main.cpp is the client code that uses the SDK.

Мой вопрос:

Безопасно ли использовать перечисляемые параметры и возвращаемые значения в общедоступном API (метод Do (действие)), если SDK и код клиента скомпилированы с разными компиляторами? Например, SDK компилируется с помощью VC, а клиентский код - с помощью gcc. Возможно ли, чтобы разные компиляторы использовали разные размеры (2,4 или 8 байт) для представления перечисления?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2011

Насколько я понимаю, компилятору разрешено выбирать конечный размер, представляющий перечисление, однако вы также можете установить минимальный размер, указав неиспользуемое значение, например, ActionForceDword = 0xFFFFFFFF.

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

0 голосов
/ 01 ноября 2011

Разные компиляторы могут давать разные размеры вашему enum, но для хорошего дизайна это не должно иметь значения.Я имею в виду ... вы бы не перестали использовать int только потому, что он имеет разные размеры на разных платформах, не так ли?

РЕДАКТИРОВАТЬ:

Если вы настаиваете на том, чтобы ваши типы имелитого же размера, используйте int32 вместо enum.Нет способа (по крайней мере, портативного) гарантировать, что enum будет иметь одинаковый размер на всех платформах.

...