There are two ways to write C++ code in EDK II.
1. Make your whole files as CPP
2. Low level files are CPP, High level files are C.
I prefer the second way because we always use C to develop UEFI driver and sometimes we want to reuse C++ components.
Please refer the UEFI原理与编程 for the detail of C++ in EDK II, where my idea comes from.
Below is my source code of UEFI application that uses C++ directly.
CppTest.inf -
The INF file defines the UEFI application, CppTest.c calls C functions of Wrap.cpp that wraps C++ of MyObject.cpp.
[Sources]
CppTest.c
MyObject.cpp
MyObject.h
Wrap.cpp
Wrap.h
MyObject.h -
Declare the class MY_OBJECT.
class MY_OBJECT
{
private:
UINT8 Value1;
UINT8 Value2;
public:
MY_OBJECT (UINT8 Value1, UINT8 Value2);
UINT8 GetValue1 ();
UINT8 GetValue2 ();
~MY_OBJECT ();
};
MyObject.cpp -
Implement the class MY_OBJECT.
MY_OBJECT::MY_OBJECT (
IN UINT8 Value1,
IN UINT8 Value2
)
{
this->Value1 = Value1;
this->Value2 = Value2;
}
UINT8
MY_OBJECT::GetValue1 ()
{
return this->Value1;
}
UINT8
MY_OBJECT::GetValue2 ()
{
return this->Value2;
}
MY_OBJECT::~MY_OBJECT ()
{
this->Value1 = 0;
this->Value2 = 0;
}
Wrap.h -
Declare the C functions that wraps the class MY_OBJECT. The term, extern "C", declares that the following functions are name mangling in C. The value of __cplusplus is 1 when CPP file includes the H file so that the term enables. That is why we use #ifdef __cplusplus to wrap the term.
#ifdef __cplusplus
extern "C" {
#endif
VOID
EFIAPI
CreateMyObject (VOID);
EFI_STATUS
EFIAPI
GetValuesOfMyObject (
OUT CHAR8 *Buffer,
IN UINTN BufferSize
);
VOID
EFIAPI
DestroyMyObj (VOID);
#ifdef __cplusplus
}
#endif
Wrap.cpp -
Implement the C wrapping functions. We use the term, extern "C", previous to each function.It is interesting that we implement new and delete operators. If we don't do it, link errors about new and delete occurs.
MY_OBJECT *mMyObject;
void * operator new (size_t Size)
{
VOID *RetVal;
RetVal = AllocatePool (Size);
return RetVal;
}
void operator delete (void *p)
{
FreePool (p);
}
extern "C"
VOID
EFIAPI
CreateMyObject (VOID)
{
mMyObject = new MY_OBJECT (10, 20);
}
extern "C"
EFI_STATUS
EFIAPI
GetValuesOfMyObject (
OUT CHAR8 *Buffer,
IN UINTN BufferSize
)
{
UINTN i;
i = 0;
if (i == BufferSize) {
return EFI_BUFFER_TOO_SMALL;
}
Buffer[i++] = mMyObject->GetValue1 ();
if (i == BufferSize) {
return EFI_BUFFER_TOO_SMALL;
}
Buffer[i++] = mMyObject->GetValue2 ();
return EFI_SUCCESS;
}
extern "C"
VOID
EFIAPI
DestroyMyObj (VOID)
{
delete mMyObject;
}
CppTest.c -
The C main program that tests the C wrapping function.
int
main (
IN int Argc,
IN char **Argv
)
{
UINT8 Buffer [10];
MY_STRUCT *MyStruct;
CreateMyObject ();
GetValuesOfMyObject (Buffer, 10);
printf ("Buffer [0] = %d\n", Buffer [0]);
printf ("Buffer [1] = %d\n", Buffer [1]);
DestroyMyObj ();
return 0;
}
-Count
canlı sex hattı
ReplyDeletehttps://girisadresi.info/
heets
salt likit
salt likit
L5WRF
beşiktaş
ReplyDeletemersin
istanbul
kumluca
küçükçekmece
2UNQK
sincan
ReplyDeletebodrum
uşak
kumluca
ankara</a
S2ROM7