【问题标题】:If there are many functions with the same parameters, should I use a macro to avoid typing the parameters multiple times? [closed]如果有许多具有相同参数的函数,我应该使用宏来避免多次键入参数吗? [关闭]
【发布时间】:2023-03-06 22:41:01
【问题描述】:

我有一些旧的 C 程序要维护。对于具有完全相同参数的某些函数(至少 10 个),程序员使用宏来避免一次又一次地键入相同的参数。这是宏定义:

#define FUNC_DECL(foo) int foo(int p1, int p2, ....)

然后,如果我想定义具有相同参数的函数,我只需要输入:

FUNC_DECL(func1) 

除了避免多次输入相同参数的繁琐工作之外,这种实现还有其他优点吗?

这种实现让我有点困惑。它还有其他缺点吗?

这种实现方式好不好?

【问题讨论】:

  • 优点是它确保定义 do 具有相同的参数列表。缺点是它看起来不像普通的 C。为什么不将这 10 个参数打包成一个结构类型(或几个),然后制作简单的函数接口呢?总的来说,我不喜欢那种基于宏的方案,但偶尔有足够的理由使用它——这可能是一个边缘例子。
  • 至少有十个函数具有相同的参数。目前每个函数只有3个参数@JonathanLeffler
  • 哦,只有3个参数?那时没有理由使用宏——我认为它是 10 个参数。清晰更重要。我不认为使用宏代码会更清晰。您需要更改 10 个函数以使用 4 个参数而不是 3 个参数的可能性非常有限——而且您必须更改代码才能使用额外的参数。带走它——带走它的脑袋!
  • 我同意@JonathanLeffler 的分析,这是对宏的错误使用。这个问题可以通过简单的复制/粘贴轻松解决。以int (int p1, int p2, int p3); 开头。复制粘贴9次,填写函数名。它实际上比使用宏要少打字,而且它不会向读者隐藏信息。
  • 恐怕你的解决方案不需要更少的打字。如果我使用宏,我也可以使用复制和粘贴。@user3386109

标签: c function macros


【解决方案1】:

正如我在 cmets 中对主要问题所指出的,使用宏来声明具有相同参数列表的函数的优点是它可以确保定义 do 具有相同的参数列表。

主要缺点是它看起来不像普通的 C,因此阅读代码的人必须搜索更多代码才能弄清楚它的含义。

总的来说,我不喜欢那种基于宏的方案,但偶尔有足够的理由使用它——这可能是一个边缘示例。

至少有十个具有相同参数的函数。目前‌​,每个函数只有3个参数。

哦,只有 3 个参数?那时没有理由使用宏——我认为它是 10 个参数。清晰更重要。我不认为使用宏代码会更清晰。您需要更改 10 个函数以使用 4 个参数而不是 3 个参数的可能性非常有限——而且您必须更改代码才能使用额外的参数。打字的保存不相关;节省对宏的含义感到困惑的时间是相关的。第一个必须对代码感到困惑的人将花费更长的时间来做这件事,而不是你省去输入函数声明的时间——即使你在打字时打猎。

除掉它——除掉它的头!删除宏。让你的代码再次快乐。

【讨论】:

    【解决方案2】:

    #define 是一种文本处理器。因此,无论您是编写完整的函数声明还是使用预处理器,两者都将以相似的执行时间做同样的事情。使用#define 使程序可读/短,并且根本不会影响最终结果,但更多数量的#define 意味着更多的编译时间,仅此而已。但一般来说,程序的使用比编译的要多。因此,#define 的使用完全不会影响您的生产环境。

    【讨论】:

    • 使用宏肯定会使程序更短,但会牺牲可读性和可维护性。 int main() { DO_STUFF(); } 不是可读程序。出于多种原因,类似函数的宏通常是不好的做法,应避免使用。
    • 我说,它可能是可读的或者会缩短程序。两者可能同时发生,或者有时它们可​​能相互矛盾,但这完全取决于你。如果你从一开始就模块化你的程序,无论是使用宏还是函数,它肯定会更易于维护。
    • 避免使用类似函数的宏的原因是什么?能否提供链接或其他内容?@Lundin
    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 2019-06-30
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多