预处理器“宏功能”与功能指针 - 最佳实践?

时间:2010-05-15 00:02:03

标签: c

我最近在C中开始了一个小型的个人项目(RGB值到BGR值转换程序),我意识到从RGB转换为BGR的功能不仅可以执行转换,还可以执行转换。显然,这意味着我不需要两个函数rgb2bgrbgr2rgb。但是,使用函数指针而不是宏是否重要?例如:

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))

我不一定在寻求改变执行效率,因为它更多是出于好奇心的主观问题。我很清楚,使用任何一种方法都不会丢失或获得类型安全。功能指针是否仅仅是一种便利,还是可以获得更多我不知道的实际好处?

2 个答案:

答案 0 :(得分:6)

另一种可能性是让第二个函数调用第一个并让编译器担心优化它(通过内联或生成尾调用)。

答案 1 :(得分:5)

我会使用宏。它更常见,更惯用,并且在翻译单元中遇到的问题更少(即您不必担心声明宏静态)。

此外,通过使用函数指针,可以防止在大多数编译器上进行内联。

最后,使用函数指针,客户端可以执行此操作:

int evil(const int bgr) { /* Do something evil */ }

bgr2rgb = evil

当然,他们可能不希望这样,但可能会有一个类似于bgr2rgb的变量,它只需要一个错字....

宏更安全,不过我会这样定义 - 这里不需要像函数一样的宏:

#define bgr2rgb rgb2bgr