Bondan Sebastian
Bondan Sebastian

Reputation: 1015

Ununderstandable function-like macro in C

i have this c macro code :

#define d(x, y, z) (    \
      x += z,               \
      y += x,               \
      x += y                \

)

I have several questions :

  1. Does this macro function return something ? (e.g. return x, y, or z) or is it just add the parameter variable with itself ? (which is useless, i think).
  2. What does the \ means ?
  3. Why does the original coder use comma-operator after each operation ? Why not just use ; instead of , ?

Any help would be appreciated

Upvotes: 1

Views: 181

Answers (3)

hariudkmr
hariudkmr

Reputation: 337

First and foremost #define is a Preprocessor Directive, which means when the source code/c code is complied the #define replaces LHS with RHS - meaning whereever the d(x,y,z) is used will be replaced with the equation given

for example the below c code will print - modified a = 9, b=8, c=9

#define d(x,y,z) \
    x+=1,       \
    y+=2,       \
    z+=3       


#include <stdio.h>

 int main()
 {
    unsigned int a,b,c;
    a=5;
    b=6;
    c=7;

    printf("modified a = %d, b=%d, c=%d \n",d(a,b,c));    
}

basically what happened here is d(a,b,c) - is replaced with a+=1,b+=2,c+=3

  1. The meaning of \ is that the pre-processor directive continues in the next line.
  2. As for as the comma-operator is concerned we need to look at source code to see where exactly it is used. as you can see in the above code the comma operator actually separates all the three variables and is able to print properly - if in case i replace comma with any other operator we will get compilation error.

Hope this answers your questions :)

Regards Hari

Upvotes: 0

Klas Lindb&#228;ck
Klas Lindb&#228;ck

Reputation: 33273

Does this macro function return something ? (e.g. return x, y, or z) or is it just add the parameter variable with itself ? (which is useless, i think).

It modifies the value of the variables. The "return" value is the final value of x.

What does the \ means ?

When placed last on a line, it negates the newline so that the macro definition can span more than one line.

Why does the original coder use comma-operator after each operation? Why not just use ; instead of `, ?

Macros replace text. Consider the following code:

int x=1, y=2, z=3, f;
f = 3 * (d(x,y,z));

If the macro uses comma, the code becomes:

int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y);  // Evaluates to 3 * (the final value of x)

If the macro uses semicolon, the code becomes:

int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y);  // Syntax error!!!

Upvotes: 5

dragosht
dragosht

Reputation: 3275

1) The macro does not return anything itself. It is just a dumb piece of code substituted literally by the preprocessor wherever it encounters it. It can be any kind of text.

2) \ is used for letting the preprocessor know that the current macro also expands over the next line. (multi-line macro)

3) I cannot make any assumption about the original coder's intentions. However by using the comma operator in there the whole macro becomes a C language expression. For example running something like this works (it wouldn't if semicolons were in there):

int a = 0;

int x = 1;
int y = 2;
int z = 3;

a = d(x, y, z);

printf("a = %d\n", a);
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("z = %d\n", z);

and prints:

a = 10
x = 10
y = 6
z = 3

Upvotes: 2

Related Questions