C++ 定义函数时可以直接给形参指定默认值,如果调用函数没有给形参赋值,那就直接使用默认值。这个功能非常容易理解。编写如下代码进行验证:
#include <UEFI/UEFI.h>
#include <type_traits>
EFI_SYSTEM_TABLE* gSystemTable;
void printInt(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* conOut, int value) {
CHAR16 out[32];
CHAR16* ptr = out;
static_assert(std::is_unsigned_v<char16_t>);
if (value == 0)
{
conOut->OutputString(conOut, u"0");
return;
}
ptr += 31;
*--ptr = 0;
int tmp = value;// >= 0 ? value : -value;
while (tmp)
{
*--ptr = '0' + tmp % 10;
tmp /= 10;
}
if (value < 0) *--ptr = '-';
conOut->OutputString(conOut, ptr);
}
void func(int a, int b=2, int c=3){
printInt(gSystemTable->ConOut,a);
gSystemTable->ConOut->OutputString(gSystemTable->ConOut, u"\r\n");
printInt(gSystemTable->ConOut,b);
gSystemTable->ConOut->OutputString(gSystemTable->ConOut, u"\r\n");
printInt(gSystemTable->ConOut,c);
gSystemTable->ConOut->OutputString(gSystemTable->ConOut, u"\r\n");
}
EFI_STATUS
efi_main(EFI_HANDLE /*image*/, EFI_SYSTEM_TABLE* systemTable)
{
gSystemTable=systemTable;
func(30);
return EFI_SUCCESS;
}
上面定义了 void func(int a, int b=2, int c=3) 这个函数,当通过func(30)调用时,相当于只给 a 赋值 30,其余的直接使用了默认值。
需要注意的是,在使用时有一些限制。比如:C++规定,默认参数只能放在形参列表的最后,而且一旦为某个形参指定了默认值,那么它后面的所有形参都必须有默认值。
参考:
1. https://c.biancheng.net/view/2204.html C++函数的默认参数详解