공용 API가있는 sdk.h 헤더 파일과 구현 된 컴파일 된 DLL로 구성된 SDK를 만들고 싶습니다.SDK API에서 enum params 및 반환 값을 사용하는 것이 안전합니까?
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.
내 질문은 :
는이 열거 PARAMS를 사용하고 공개 API에 값을 반환 안전한가요 (방법 음주 (조치는)) SDK 및 클라이언트 코드는 다른 컴파일러로 컴파일하는 경우? 예를 들어 SDK는 VC로 컴파일되고 클라이언트 코드는 gcc로 컴파일됩니다. 다른 컴파일러가 다른 크기 (2,4 또는 8 바이트)를 사용하여 열거 형을 나타낼 수 있습니까?
다른 크기가 표준에서 허용됩니다. 중요한 문제 (이 답변에 대해 모르므로이 내용은 주석입니다)는 관심있는 플랫폼의 C++ ABI (s)와 열거 형의 기본 유형을 결정하는 방법. 어떤 플랫폼이 좋을지 모른다면, ABI의 일부가 아닌 ABI의 일부로 처리해야하므로 실행 가능한 경계를 넘어서는'enum '을 전달할 수 없습니다. std :: 문자열'. –
이것이 실제 충돌의 예라고 생각합니다. http://osdir.com/ml/android-ndk/2010-10/msg00559.html. 게시물이 사실이라고 가정 할 때, 안드로이드의 toolchain은 기본적으로 가능한 한 짧은 enum을 사용하도록 설정되어 있지만, 일부 libstdC++ dll은 적어도 int를 사용합니다. 따라서'-fno-short-enums '로 컴파일하지 않는다면'short'에 맞는 enum은 두가지 사이에 호환되지 않습니다. 따라서 "두 컴파일러"가 모두 GCC이지만'-fshort-enums '이없는 컴파일러 인 경우 잠재적으로 안전하지 않을 수 있습니다. 'int'보다 작은 매개 변수가'int'로 전달되면 여러분은 그것을 벗어날 수 있습니다. –