上次的代码中碰到了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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <Uefi.h>
#include <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;
}
模拟器中测试,得到了期望的结果:

完整的代码下载: