1. 打印off_t,size_t,ssize_t的占位符
To print off_t:
printf("%jd\n", (intmax_t)x);
To print size_t:
printf("%zu\n", x);
To print ssize_t:
printf("%zd\n", x);
2. 编译时检查表达式是否成立
#define UTILS_COMPILETIME_ASSERT(condition) \
do { \
typedef char ErrorCheck##__FILE__##__LINE__[((condition) == TRUE) ? 1:-(Int32)1];\
} while(0)
说明:
- 定义一个,一个元素的char数组,若检查condition非法,则为非法定义,
- 同时通过
__FILE__
和__LINE__
的宏定义,区分“char数组名称”,防止命名冲突
举例:
UTILS_COMPILETIME_ASSERT(SYSTEM_MAX_PLANES == FVID2_MAX_PLANES)
检查在应用层和驱动层两个宏定义的值是否相等
3. getchar()遗留字符串
当使用getchar
从stdin
获取字符时,该函数不会将换行符从stdin
中读出,如果此时使用fgets之类的函数从stdin
读取字符串,则函数因为读到了stdin
中残留的换行,将直接返回。而不会按照预期,等待键盘输入。
解决方法:
while((c = getchar()) != '\n' && c != EOF)
使用以上函数语句,消耗掉stdin
中的残留字符。
另外,scanf
,fgetc
,getc
等函数也有类似的问题。
详细说明:
参考Stack Overflow中的描述:https://stackoverflow.com/questions/34219549/how-to-properly-flush-stdin-in-fgets-loop
4. 获取上下文中寄存器的值
// 以打印 sp 寄存器为例
asm("mov %0, sp" : "=r" (sp));
printf("------@line %d, SP: %016lx\n", __LINE__, sp);