Dynamically changing operator in C

Currently having many codes that only differ in 1 operator (e.g. + ,- ,* ,/ ,& ,| ,== , etc... ) Is it possible to combine these into one common function in C with the operator as a parameter ? Thank you.

Example1

   for (int y = 0; y < v3->y; y++)
            {
                for (int x = 0; x < v3->x; x++)
                {
                    v3->num[y][x] = v1->num[y][x] + v2->num[y][x];
                }
            }

Example2

   for (int y = 0; y < v3->y; y++)
            {
                for (int x = 0; x < v3->x; x++)
                {
                    v3->num[y][x] = v1->num[y][x] * v2->num[y][x];
                }
            }

Example3

   for (int y = 0; y < v3->y; y++)
            {
                for (int x = 0; x < v3->x; x++)
                {
                    v3->num[y][x] = v1->num[y][x] | v2->num[y][x];
                }
            }

Not sure if possible, but Expected something like this...

   for (int y = 0; y < v3->y; y++)
            {
                for (int x = 0; x < v3->x; x++)
                {
                    v3->num[y][x] = v1->num[y][x] operator v2->num[y][x];
                }
            }

Solution 1:

As PMF mentions in the comments, you can use a macro – either to wrap just the v3 = v1 OP v2 computation, or the entire loop, such as here (godbolt)

// NB: v1, v2, v3 need to be simple identifiers, this macro is not safe otherwise
#define VLOOP(v3, v1, v2, op) \
    for (int y = 0; y < v3->y; y++) \
    for (int x = 0; x < v3->x; x++) \
    v3->num[y][x] = v1->num[y][x] op v2->num[y][x]

typedef struct {
    int x;
    int y;
    int **num;
} V;

void compute_sum(V* v3, V* v1, V* v2) {
    VLOOP(v3, v1, v2, +);
}

void compute_product(V* v3, V* v1, V* v2) {
    VLOOP(v3, v1, v2, *);
}

void compute_division(V* v3, V* v1, V* v2) {
    VLOOP(v3, v1, v2, /);
}

// etc...

Solution 2:

You can try this:


#define DO_OP(op) for (int y = 0; y < v3->y; y++) \
            {\
                for (int x = 0; x < v3->x; x++)\
                {\
                    v3->num[y][x] = v1->num[y][x] op v2->num[y][x];\
                }\
            }

This does not reduce the size of the generated code, but the source will be much smoother. Use as

DO_OP(*)
DO_OP(/)
// etc...