【问题标题】:Is there a function equivalent that can take in statements as arguments?是否有可以将语句作为参数的等效函数?
【发布时间】:2018-10-18 06:06:44
【问题描述】:

我有以下代码部分,我需要在整个程序中使用大约 5 次,但使用不同的代码行代替注释。

while (loop_day < (day+1)) {
    while (loop_size < (size+1)) {

        //new lines here

        size = size + 1;
    }
    loop_day = loop_day + 1;
}

我可以多次复制和粘贴此内容,但出于审美原因,我真的宁愿不这样做。我尝试搜索“可以将语句作为参数的函数”,但没有找到合适的。

编辑:我想将各种语句“嵌入”到代码中。

一个例子:

while (loop_day < (day+1)) {
    while (loop_size < (size+1)) {

        // code that stores various values into an array

        size = size + 1;
    }
    loop_day = loop_day + 1;
}


while (loop_day < (day+1)) {
    while (loop_size < (size+1)) {

        // code that reads values stored in that array

        size = size + 1;
    }
    loop_day = loop_day + 1;
}

但我想要一些类似的东西:

custom_loop {
// code that stores various values into an array
}

custom_loop {
// code that reads values stored in that array
}

【问题讨论】:

  • 也许inline 函数可以提供帮助。
  • 谷歌的两件事:宏和函数指针。
  • new lines here 依赖哪些变量?
  • 完成代码以显示示例。
  • 简单地写一个函数。

标签: c code-duplication


【解决方案1】:

你可以想到回调函数。例如,

typedef void (*t_func)(int, int);

void doLoopOverDaysAndSize(t_func callback)
{
    while (loop_day < (day+1)) {
        while (loop_size < (size+1)) {
            callback(loop_day, loop_size)
            size = size + 1;
        }
        loop_day = loop_day + 1;
    }
 }

然后你可以像这样传递一些函数

void myDaySizeHandler(int day, int size)
{
    // do something
}

【讨论】:

  • 您能否详细说明我如何将其应用于我的情况?
  • 基本上,你实现一次函数 doLoopOverDaysAndSize() 如上所述。当然,变量 loop_day 和 loop_size 应该是正确定义的局部变量。此外,您应该关心如何为函数提供日期和大小。从您的应用程序的上下文中应该可以清楚地看到这一点。然后你实现各种函数,比如 myDaySizeHandler 应该包含循环体。它对应于您的注释 // 读取存储在该数组中的值的代码。然后你可以调用 doLoopOverDaysAndSize(myDaySizeHandler);
  • @pulpbag 你说你有一段重复的代码,你想用它来包装各种代码。回调(函数指针)是如何做到这一点的:你传入一个函数并在包装“你想要传入的语句”的代码中执行它,这些语句在你传递给循环的函数中。只是谷歌的“回调函数”,我的意思是,答案中的代码几乎是逐字实现:你的陈述进入myDaySizeHandler
【解决方案2】:

人们往往会忘记包含可以在代码中的任何位置使用,并且不仅仅对标头有用(Including one C source file in another?)。然而,有些人不喜欢他们。

例子:

common.inc:

x = x + 1;

main.c

int main()
{
    {
        int x = 3;
#include "common.inc"
        printf("x = %d\n", x);
    }
    {
        double x = 1.234;
#include "common.inc"
        printf("x = %f\n", x);
    }
    return 0;
}

-编辑- 对于您的代码,这将导致:

commonStart.inc

while (loop_day < (day+1))
{
    while (loop_size < (size+1))
    {

commonEnd.inc

        size = size + 1;
    }
    loop_day = loop_day + 1;
}

main.c

#include "commonStart.inc"
//new lines here
#include "commonEnd.inc"

【讨论】:

  • 我看不到如何使用它在上述代码位(自定义循环,如果你愿意的话)中嵌入多个语句。
  • 它会起作用,但是当你有函数指针时,这似乎是一件奇怪的事情。而且 IMO 更难阅读或推理。
  • 这将是问题的答案:“我怎样才能编写比我自己发明一些晦涩的、类似函数的宏语言更糟糕的代码”。从不包括这样的滥用,这不过是混淆和真正糟糕的建议。
  • “不过,有些人不喜欢他们。”在这里,“一些”是指“基本上每个人”吗?我正在努力想出一个不能通过指针或宏更好地处理的有效用例。你能举个例子说明这是个好主意吗?
猜你喜欢
  • 2020-04-24
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多