Step to UEFI (307)UEFI 下使用PRIu8 以及类似宏

上次的代码中碰到了C语言中的 PRIu8 ,这次专门研究了一下如何在代码中直接使用。

<inttypes.h> 是 C 标准库提供的头文件,其中有定义(例如EDK2 中的StdLib\Include\X64\machine\int_fmtio.h文件):

#define	PRIu8		"u"	/* uint8_t		*/
#define	PRIu16		"u"	/* uint16_t		*/
#define	PRIu32		"u"	/* uint32_t		*/

它们C99 标准引入的格式说明符宏。可以通过下面的这种方法进行使用:

printf("Value: %" PRIu16 "\n", value);

在 C 语言中,当你编写多个字符串字面量(例如使用双引号括起来的字符串)在代码中相邻放置时,编译器会自动将它们连接起来形成一个单独的字符串,这被称作C 语言的字符串字面量的自动连接,所以上述代码展开后就是:

printf("Value: %u \n", value);

在EDK2 中编译一个简单的代码进行验证:

#include &lt;stdio.h>
#include &lt;stdlib.h>
#include &lt;string.h>
#include &lt;inttypes.h> 
#include &lt;Uefi.h>
#include &lt;Library/UefiLib.h>

#define LABZTest "LABZ"
int main(int argc, char *argv[]) {
    printf("Value: " LABZTest "\n");
    return 0;
}

模拟器中运行结果如下:

上述试验说明 VC2019 完全支持字符串字面量的自动连接。

所以理论上只要引用了inttypes.h 就可以使用PRIu8 这种宏定义,但是还是会遇到编译期的错误。经过研究发现 \StdLib\Include\inttypes.h 中相关引用是被注释掉的。下图中左侧是原始的代码,右侧是修改后的。完全无法理解原始代码要去掉这个引用,经过这样的修改即可正常编译和执行:

完整的测试代码:

#include <stdio.h>
#include <inttypes.h> 
#include <Uefi.h>
#include <Library/UefiLib.h>

int main(int argc, char *argv[]) {

    printf("Value: %" PRIu8 "\n",1234);

    return 0;
}

模拟器中测试,得到了期望的结果:

完整的代码下载:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注