Есть ли эквивалент функции, который может принимать операторы в качестве аргументов? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующий раздел кода, который мне нужно использовать примерно 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
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Люди склонны забывать, что включения могут использоваться в любом месте вашего кода и не только полезны для заголовков ( Включение одного исходного файла C в другой? ). Однако некоторые их осуждают.

Пример:

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;
}

-Edit- Для вашего кода это приведет к:

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"
0 голосов
/ 08 мая 2018

Вы можете думать о функциях обратного вызова. Например,

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
}
...