编译UEFI代码遇指针符号不匹配警告,求解释及修复方法
UEFI代码编译警告:指针符号不匹配问题
代码示例
//#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: warning: passing 'unsigned short[8]' to parameter of type 'CHAR16 *' (aka 'short *') converts between pointers to integer types with different sign [-Wpointer-sign] Print(L"Welcome", _SystemTable); ^~~~~~~~~~ src/efi_main.c:7:20: note: passing argument to parameter 'String' here void Print(CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable); ^
警告原因解释
这个警告的核心是指针指向的整数类型符号不匹配:
- UEFI规范里,
CHAR16实际被定义为无符号16位整数(unsigned short); - 但函数声明里的
CHAR16*被编译器解析为有符号的short*,和字符串字面量L"..."的类型(unsigned short[])不兼容,触发了符号不匹配的风险警告。
修复方法
有两种可靠的修复方式:
方法1:统一使用CONST CHAR16*作为字符串参数类型
UEFI的OutputString接口本身要求的参数就是CONST CHAR16*,且字符串字面量不可修改,用const修饰更符合语义。修改函数声明和定义:
// 函数声明 void PrintLn(CONST CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable); void Print(CONST CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable); // 函数定义 void Print(CONST CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable) { _SystemTable->ConOut->OutputString(_SystemTable->ConOut, String); } void PrintLn(CONST CHAR16* String, EFI_SYSTEM_TABLE* _SystemTable) { _SystemTable->ConOut->OutputString(_SystemTable->ConOut, String); _SystemTable->ConOut->OutputString(_SystemTable->ConOut, L"\r\n"); }
方法2:修正CHAR16的类型定义(若头文件存在错误)
如果你的uefi.h中CHAR16被错误定义为signed short,可以手动修正头文件里的定义:
typedef unsigned short CHAR16;
不过这种情况极少,UEFI标准头文件中CHAR16默认就是无符号类型,优先推荐方法1。
内容的提问来源于stack exchange,提问作者ZebCpu
相关产品推荐
相关产品推荐

