代码之家  ›  专栏  ›  技术社区  ›  Dustin

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

c
  •  6
  • Dustin  · 技术社区  · 14 年前

    我最近在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))
    

    我不一定要在执行效率上有所改变,因为这更多是出于好奇而提出的主观问题。我很清楚,无论使用哪种方法,类型安全性都不会丢失或获得。函数指针仅仅是一种方便,还是有更多我不知道的实际好处?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Christopher Barber    14 年前

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

        2
  •  5
  •   Billy ONeal IS4    14 年前

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

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

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

    当然,他们可能不想要这个,但可能有一个变量名为 bgr2rgb 只需要一个打字错误。。。。

    宏更安全,尽管我会这样定义——这里不需要像宏这样的函数:

    #define bgr2rgb rgb2bgr