在SDK API中使用枚举参数和返回值是否安全?

时间:2011-11-01 08:08:50

标签: c++ api visual-c++ gcc sdk

我想创建一个SDK,它包含带有公共API的头文件sdk.h和带有实现的已编译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.

我的问题是:

如果SDK和客户端代码是使用不同的编译器编译的,那么使用enum params并在公共API(方法Do(action))中返回值是否安全?例如,SDK使用VC编译,客户端代码使用gcc编译。是否有可能不同的编译器使用不同的大小(2,4或8个字节)来表示枚举?

2 个答案:

答案 0 :(得分:0)

不同的编译器可能会为您的enum提供不同的大小,但对于一个好的设计,这应该不重要。我的意思是......你不会因为它在不同的平台上有不同的尺寸而停止使用int,是吗?

编辑:

如果您坚持使用相同尺寸的类型,请使用int32代替enum。没有办法(至少是可移植的方式)保证enum在所有平台上具有相同的大小。

答案 1 :(得分:0)

根据我的理解,允许编译器选择代表枚举的最终大小,但是你也可以通过定义一个未使用的值来强制大小,ActionForceDword = 0xFFFFFFFF

或者,您可以将参数声明为整数类型。然而,你仍然受编译器同意给定类型大小的支配。