我有以下代码:
//#include "stdint.h"
#include "uefi.h"
//#include "efi_libs.h"
void PrintLn(CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable);
void Print(CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable);
EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* _SystemTable)
{
// SystemTable = _SystemTable;
_SystemTable->ConOut->Reset(_SystemTable->ConOut, 1);
_SystemTable->ConIn->Reset(_SystemTable->ConIn, 1);
_SystemTable->ConOut->SetAttribute(_SystemTable->ConOut, EFI_GREEN);
Print(L"Welcome", _SystemTable);
PrintLn(L"Press any key to continue...", _SystemTable);
EFI_INPUT_KEY key;
while (_SystemTable->ConIn->ReadKeyStroke(_SystemTable->ConIn, &key) == EFI_NOT_READY);
return EFI_SUCCESS;
}
void Print(CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable)
{
_SystemTable->ConOut->OutputString(_SystemTable->ConOut, String);
}
void PrintLn(CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable)
{
_SystemTable->ConOut->OutputString(_SystemTable->ConOut, String);
_SystemTable->ConOut->OutputString(_SystemTable->ConOut, L"\r\n");
}
编译时我收到此警告:
src/efi_main.c:17:8:警告:将“无符号短[8]”传递给“CHAR16”类型的参数(又名“short”)会在指向具有不同符号的整数类型的指针之间转换[-Wpointer-sign ] Print(L"欢迎", _SystemTable); ^~~~~~~~~~ src/efi_main.c:7:20:注意:在此处将参数传递给参数“String” void Print(CHAR16 字符串, EFI_SYSTEM_TABLE _SystemTable); ^
现在距离我编写 ANSI C 已经很多年了,我不知道如何消除该警告,有人可以向我解释该警告并告诉我如何修复它吗?
谢谢
我已经尝试研究这个问题,但我没有进一步研究。
您的
Print
接受指向 CHAR16
的指针,即 short
即 signed short
。然而,L"Welcome"
产生一个指向wchar_t
的指针,即unsigned short
。因此,您尝试将 unsigned short *
传递到 signed short *
参数中,因此会出现警告。
因此,解决方案是更改与字符串相关的函数以接受
wchar_t *
而不是 CHAR16 *
参数,或者更改 CHAR16
的 typedef 以使其兼容,将其设为 unsigned
而不是 signed
。