我想创建一个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个字节)来表示枚举?
答案 0 :(得分:0)
不同的编译器可能会为您的enum
提供不同的大小,但对于一个好的设计,这应该不重要。我的意思是......你不会因为它在不同的平台上有不同的尺寸而停止使用int
,是吗?
编辑:
如果您坚持使用相同尺寸的类型,请使用int32
代替enum
。没有办法(至少是可移植的方式)保证enum
在所有平台上具有相同的大小。
答案 1 :(得分:0)
根据我的理解,允许编译器选择代表枚举的最终大小,但是你也可以通过定义一个未使用的值来强制大小,ActionForceDword = 0xFFFFFFFF
。
或者,您可以将参数声明为整数类型。然而,你仍然受编译器同意给定类型大小的支配。