我是C新手,正在尝试修改和编译EDK2 EFI程序。
我想要更改的程序部分有一个函数
MsgLog
,它接受一个 Char16 *
变量并使用它写入日志文件。
当前代码有这个
MsgLog("SomeText ...%r\n", Status);
Status 是 EFI_STATUS,可以是“成功”或“未找到”。即,您可以在日志文件中获取以下内容:
SomeText ...Success
或
SomeText ...Not Found
我想将其更改为:
SomeText ...Success : ABC
或
SomeText ...Not Found : XYZ
我已将
: ABC
或 : XYZ
加载到 Char16 *
变量中(必须是 Char16 * 以匹配用于设置此值的函数的其他限制)
然后我尝试了各种选项将其附加到字符串中,例如
MsgLog("SomeText ...%r%s\n", Status, myVariable);
和
MsgLog("SomeText ...%r%r\n", Status, myVariable);
但我最终
SomeText ...Success<null string>
和
SomeText ...Not Found<null string>
我不确定我应该使用什么格式占位符,或者是否或如何将 myVariable 转换为其他适当的格式,并且希望得到一些指示。
请注意,这是一个更广泛的程序,我正在更改其中的一小部分,并且我没有范围来定义不同的变量类型。
编辑:添加上下文
原始工作代码
EFI_STATUS Funct_A()
{
EFI_STATUS Status;
//Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
Status = Funct_B();
MsgLog("SomeText ...%r\n", Status);
问题代码
EFI_STATUS Funct_A()
{
EFI_STATUS Status;
CHAR16 *myVariable = NULL;
//Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
Status = Funct_B();
// From some header file, I see "#define SPrint UnicodeSPrint". Not 100% sure it is the relevant one
// From other code implementations, I know SPrint takes "CHAR16" as first variable.
if (!EFI_ERROR (Status)) {
SPrint (myVariable, 255, L" : ABC");
} else {
SPrint (myVariable, 255, L" : XYZ");
}
MsgLog("SomeText ...%r%r\n", Status, myVariable);
// MsgLog is a bit of a rabbit's warren and I can't provide all the background but it expects "CHAR16".
SPrint (myVariable, 255, L" : ABC");
错了。 myVariable
是 NULL
- 您无法写入 NULL
指针。如果你想使用 SPrint
,你必须实际为字符串分配内存。有关更多信息,请回顾您有关指针和 snprintf
标准 C 函数的知识。 SPrint
的第二个参数实际上是分配的内存大小 - 您没有分配内存,因此 255
是无效的。
CHAR16 myVariable[255];
SPrint(myVariable, sizeof(myVariable), L" : ABC");
但就你而言,这样做是没有意义的。首先,不需要使用
SPrint
- 您不使用格式化字符串。一个简单的 StrCpy
(即标准 wcscpy
/strcpy
的替代品)就足够了。但话虽如此,您根本不需要任何内存,只需使用指针指向字符串文字即可。
const CHAR16 *myVariable = NULL;
if (!EFI_ERROR (Status)) {
myVariable = L" : ABC";
} else {
myVariable = L" : XYZ";
}
// or simpler
myVariable = !EFI_ERROR (Status) ? L" : ABC" : L" : XYZ";
我收到以下错误 - 当我尝试使用
SPrint
构建缓冲区以便我可以使用它写入 logfile
implicit declaration of function ‘SPrint’; did you mean ‘Print’?
我的代码类似于以下内容:
VOID WriteLog(CHAR16 *fmt, ...)
{
VA_LIST Args;
CHAR16 Buffer[1024];
UINTN BufferSize;
... open log file here ...
VA_START(Args, fmt);
BufferSize = SPrint(Buffer, sizeof(Buffer), fmt, Args); => it says SPrint not found
VA_END(Args);
Status = File->Write(File, &BufferSize, Buffer);
...
我尝试过同时包含
Library/BaseLib.h
和 Library/BasePrintLib.h
- 但徒劳。