GCC和VC ++中的宏

时间:2015-04-21 22:20:37

标签: c visual-c++ gcc

我在VC ++和GCC中编译了这个代码,产生了不同的输出,并且如果有人可以指出我出错的地方,我会很感激。

#include "stdio.h"

#define Cube(x) x*x*x

int main(void){

    int x=5;
    printf("%d\r\n", Cube(x++));

return 0;
}

在GCC中,显示的值为210(= 5 * 6 * 7),在VC ++ 2010中为125(= 5 * 5 * 5)。

如果我这样做,

#include "stdio.h"

#define Cube(x) x*x*x

int main(void){

    int x=5;
    printf("%d\r\n", Cube(++x));

return 0;
}

VC ++打印512(= 8 * 8 * 8),GCC打印392(= 7 * 7 * 8)。

感谢有人可以说最新情况。

1 个答案:

答案 0 :(得分:3)

该行

printf("%d\r\n", Cube(x++));

预处理为:

printf("%d\r\n", x++*x++*x++));

这是未定义行为的原因。

printf("%d\r\n", ++x*++x*++x));

也是未定义行为的原因。

请参阅
Why the output of this program is 41? is it undefined behavior?
Why are these constructs (using ++) undefined behavior?

您可以通过将Cube转换为函数来避免此问题。下面的程序表现良好。

#include "stdio.h"

int Cube(int x)
{
   return x*x*x;
}

int main(void)
{
   int x=5;
   printf("%d\r\n", Cube(x++));
   printf("%d\r\n", Cube(++x));

   return 0;
}