【问题标题】:What are the benefits of using #define over creating a function?与创建函数相比,使用#define 有什么好处?
【发布时间】:2026-01-11 23:50:01
【问题描述】:

警告:请多多包涵,我是新手,不完全理解这段代码。

所以在这里的代码库https://github.com/huwan/mini-vtysh/blob/master/vtysh/vtysh.c 中,他们不只是创建函数,而是使用“DEFUNSH”作为函数的替代品。 “DEFUNSH”的定义如下:

#define DEFUNSH(daemon, funcname, cmdname, cmdstr, helpstr) \
  int funcname (struct cmd_element *, struct vty *, int, char **); \
  struct cmd_element cmdname = \
  { \
    cmdstr, \
    funcname, \
    helpstr, \
    daemon \
  }; \
  int funcname \
  (struct cmd_element *self, struct vty *vty, int argc, char **argv)

我不太了解它的好处,而且对我来说,它只会使它更难阅读。使用#define的目的是什么?

【问题讨论】:

  • 将标签更改为C,因为您引用的是 C 代码
  • 嗯,首先,它为每个 {structure,function} 组合节省大量文本。
  • #define 是一个宏指令。懂宏,你就会懂#define
  • 使用gcc -E 查看应用宏后会发生什么
  • 是什么让您认为这段代码一开始就有什么好处,或者它是由一个体面的程序员编写的?链接的源文件显示完全没有正确的程序设计。 Github 是一个垃圾场。

标签: c


【解决方案1】:

宏声明一个函数,定义一个被初始化的结构变量(包括一个指向刚刚声明的函数的指针)然后写函数定义的开头。它使程序员不必编写大量“样板”代码——标准化且乏味的代码。

【讨论】:

    【解决方案2】:

    在这种情况下,这不是样式问题,而是函数和宏的不同功能的问题。 #defined 宏是一个简单的文本替换,其中:

    #define FOO(x, y) x + y
    FOO(2, 3)
    

    完全相同的代码,当编译器看到它时,如:

    2 + 3
    

    在 C 中,不能动态定义结构和函数。这个特定的宏定义了一个具有给定名称的函数,这是 C 中的函数无法完成的。

    在其他一些情况下,宏与函数是风格、品味和编码实践的问题。例如,有两个参数需要:

    #define COMPUTE_IT(x, y, z) x * y * ( z - 1 )
    

    还有:

    int compute_it(int x, int y, int z) {
      return x * y * (z - 1);
    }
    

    这一切都取决于上下文。

    【讨论】: