funptrs.c
来自「sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu」· C语言 代码 · 共 141 行
C
141 行
/** Function pointer tests. type: BOOL, char, int, long */#include <testfwk.h>#include <stdbool.h>#ifndef BOOL#define BOOL bool#endif#define TYPE_{type}/* Must use a typedef as there is no way of adding the code modifier on the z80.*/typedef void (*NOARGFUNPTR)(void);typedef void (*ONEARGFUNPTR)({type}) REENTRANT;typedef long int (*FOURARGFUNPTR)(char, char, long int, long int) REENTRANT;typedef {type} (*TYPEFUNPTR)({type}, {type}) REENTRANT;int count;FOURARGFUNPTR fafp;TYPEFUNPTR tfp;voidincCount(void){ count++;}voidincBy({type} a) REENTRANT{ count += a;}long int f6(char a, char b, long int c, long int d) REENTRANT{ switch (a) { case 0: return a; case 1: return b; case 2: return c; case 3: return d; } return 0;}voidcallViaPtr(NOARGFUNPTR fptr){ (*fptr)();}voidcallViaPtr2(ONEARGFUNPTR fptr, {type} arg){ (*fptr)(arg);}voidcallViaPtr3(void (*fptr)(void)){ (*fptr)();}voidcallViaPtrAnsi(NOARGFUNPTR fptr){ fptr();}voidcallViaPtr2Ansi(ONEARGFUNPTR fptr, {type} arg){ fptr(arg);}voidcallViaPtr3Ansi(void (*fptr)(void)){ fptr();}{type} f_ret({type} arg1, {type} arg2) REENTRANT{ {type} local; local = !arg1; return (local & arg2);}voidtestFunPtr(void){ fafp = f6; ASSERT(count == 0); callViaPtr(incCount); ASSERT(count == 1); callViaPtr2(incBy, 7); ASSERT(count == 8 || count == 2); ASSERT((*fafp)(0, 0x55, 0x12345678, 0x9abcdef0) == 0); ASSERT((*fafp)(1, 0x55, 0x12345678, 0x9abcdef0) == 0x55); ASSERT((*fafp)(2, 0x55, 0x12345678, 0x9abcdef0) == 0x12345678); ASSERT((*fafp)(3, 0x55, 0x12345678, 0x9abcdef0) == 0x9abcdef0);}voidtestFunPtrAnsi(void){ fafp = f6; count = 0; callViaPtrAnsi(incCount); ASSERT(count == 1); callViaPtr2Ansi(incBy, 7); ASSERT(count == 8 || count == 2); ASSERT(fafp(0, 0x55, 0x12345678, 0x9abcdef0) == 0); ASSERT(fafp(1, 0x55, 0x12345678, 0x9abcdef0) == 0x55); ASSERT(fafp(2, 0x55, 0x12345678, 0x9abcdef0) == 0x12345678); ASSERT(fafp(3, 0x55, 0x12345678, 0x9abcdef0) == 0x9abcdef0);}voidtestFunPtrReturn(void){ tfp = f_ret; ASSERT(tfp(0, 0) == 0); ASSERT(tfp(0, 1) == 1); ASSERT(tfp(1, 0) == 0); ASSERT(tfp(1, 1) == 0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?