c语言表驱动参数传递[0803]
最近发现使用表驱动确实可以大大美化代码,
而且如果仅仅是常数型的,编译出来的代码执行效率更高,这点在单片机上尤为明显[实际上就是查表的效率高些]。
最近测试了下,使用表驱动方式调用函数,
但是发现参数的个数如果不定就是个麻烦了
但是gcc似乎在某些时候的检测并不那么严格,所以下面的代码还是可以无错运行的
[但是g++是会报错的,不过c++已经有很好的物件导向了,一般也不用函数指针了]
Code
程序运行结果如下
output -> a
output -> a2
output -> a
output -> b(20)
error:table:out of range
那么如果函数需要有些有返回值呢?
将上面的程序修改如下
Code
从编译的结果,可以看到gcc已经能够正确的报出警告
但程序还是能够运行的,比较有意思的是对于实际上不应返回的函数此时会使a改变
其输出结果如下
output -> a
now a is 14
output -> a2
now a is 15
output -> a
now a is 14
output -> b(20)
now a is 18
output -> b(100)
now a is 200
error:table:out of range
而且如果仅仅是常数型的,编译出来的代码执行效率更高,这点在单片机上尤为明显[实际上就是查表的效率高些]。
最近测试了下,使用表驱动方式调用函数,
但是发现参数的个数如果不定就是个麻烦了
但是gcc似乎在某些时候的检测并不那么严格,所以下面的代码还是可以无错运行的
[但是g++是会报错的,不过c++已经有很好的物件导向了,一般也不用函数指针了]
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
程序运行结果如下
output -> a
output -> a2
output -> a
output -> b(20)
error:table:out of range
那么如果函数需要有些有返回值呢?
将上面的程序修改如下
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
从编译的结果,可以看到gcc已经能够正确的报出警告
但程序还是能够运行的,比较有意思的是对于实际上不应返回的函数此时会使a改变
其输出结果如下
output -> a
now a is 14
output -> a2
now a is 15
output -> a
now a is 14
output -> b(20)
now a is 18
output -> b(100)
now a is 200
error:table:out of range