我最近在C中开始了一个小型的个人项目(RGB值到BGR值转换程序),我意识到从RGB转换为BGR的功能不仅可以执行转换,还可以执行转换。显然,这意味着我不需要两个函数rgb2bgr
和bgr2rgb
。但是,使用函数指针而不是宏是否重要?例如:
int rgb2bgr (const int rgb);
/*
* Should I do this because it allows the compiler to issue
* appropriate error messages using the proper function name,
* not to mention possible debugging benefits?
*/
int (*bgr2rgb) (const int bgr) = rgb2bgr;
/*
* Or should I do this since it is merely a convenience
* and they're really the same function anyway?
*/
#define bgr2rgb(bgr) (rgb2bgr (bgr))
我不一定在寻求改变执行效率,因为它更多是出于好奇心的主观问题。我很清楚,使用任何一种方法都不会丢失或获得类型安全。功能指针是否仅仅是一种便利,还是可以获得更多我不知道的实际好处?
答案 0 :(得分:6)
另一种可能性是让第二个函数调用第一个并让编译器担心优化它(通过内联或生成尾调用)。
答案 1 :(得分:5)
我会使用宏。它更常见,更惯用,并且在翻译单元中遇到的问题更少(即您不必担心声明宏静态)。
此外,通过使用函数指针,可以防止在大多数编译器上进行内联。
最后,使用函数指针,客户端可以执行此操作:
int evil(const int bgr) { /* Do something evil */ }
bgr2rgb = evil
当然,他们可能不希望这样,但可能会有一个类似于bgr2rgb
的变量,它只需要一个错字....
宏更安全,不过我会这样定义 - 这里不需要像函数一样的宏:
#define bgr2rgb rgb2bgr