Here\'s the code:
#include
#include
#define VAL1(a,b) a*b
#define VAL2(a,b) a/b
#define VAL3(a,b) ++a%b
int main()
{
In one case you have + ++
and in the other case you have ++ +
. + ++
and ++ +
are different streams of tokens. Macro pasting doesn't change tokenization because it's tokens that are pasted.
If you punch your program into a C pre-processor, you'll get this out for that line:
int result = a/d/e*b+ ++c%d;
Notice that the preprocessor had to insert a space because one is mandatory between a +
token and a ++
token.
I tried to compile it with GCC 4.7, and the two expressions gave the same results.
If you want to see how macro will expand, you can use cpp
, which is the C Preprossessor, and will give you the output after preprocessor expression are executed, here the output is
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 3;
int e = 5;
int result = a/d/e*b+++c%d;
int result2 = a/d/e*b+++c%d;
printf("%d %d\n", result, result2);
return 0;
}
If you really think it is necessary to use such macros, you'll need to use parenthesis ()
to avoid side-effects:
#define VAL1(a,b) ((a)*(b))
#define VAL2(a,b) ((a)/(b))
#define VAL3(a,b) ((++a)%(b))