#include输出 解读#define ARR_SIZE 3 typedef int (*HookFunc)(int a, int b); typedef struct { int a; int b; HookFunc pFunc; }Obj_T; int getMax(int a, int b) { return a > b ? a : b; } int getMin(int a, int b) { return a < b ? a : b; } int isEqual(int a, int b) { if (a == b) { return 0; } return 1; } int main() { Obj_T t[ARR_SIZE]; t[0].a = 1; t[0].b = 5; t[0].pFunc = getMax; t[1].a = 7; t[1].b = 4; t[1].pFunc = getMin; t[2].a = 5; t[2].b = 5; t[2].pFunc = isEqual; for (int i = 0; i < ARR_SIZE; i++) { if (t[i].pFunc) { char str[30]; sprintf(str,"t[%d] = %d",i, t[i].pFunc(t[i].a, t[i].b)); printf("%sn", str); } } }
- sprintf格式化函数。该库函数的头文件为
,发送格式化输出到 str 所指向的字符串。函数声明: int sprintf(char *str, const char *format, …)
str – 指向一个字符数组的指针,该数组存储了 C 字符串。
format – 字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。 - 回调函数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
- 如果不使用回调函数,而采用全局变量,由于数组中每个元素的动作函数不同,则数组中每次执行动作,都需要增加下标判断并调用函数,结构就会更加复杂。
- 如果不使用sprintf()格式化函数,需要根据下标打印对象名称,也需要增加额外的判断逻辑。
- 这里sprintf() 和回调函数的使用,使得代码结构更加优美。



