该代码段中的宏如何工作?

时间:2019-05-20 08:48:45

标签: c macros

当我在以下代码中将函数用作宏时,它会通过空运行给出我无法获得的输出。

我尝试查找运算符的优先级图表,但无济于事。

#include <stdio.h>
# define PRODUCT(x) (x*x)
int main()
{
    int i=3,j,k;
    j=PRODUCT(i++);
    k=PRODUCT(++i);
    printf("\n %d %d",j,k);

    return 0;
}

空试后得到的输出是:12 42。 但是,显示的输出是12 49。

1 个答案:

答案 0 :(得分:-4)

宏与C ++中的等效inline函数相同。它们通过将“函数调用”扩展为用预处理指令#define编写的实际代码来工作。

这是棘手的地方,它们扩展为ad-literam代码,因此对于定义的宏:

#define PRODUCT(x) (x*x)

“呼叫” PRODUCT(i++)的等效代码为

i++ * i++

解析为undefined behavior。之所以会调用此错误,是因为某些编译器将对此进行不同的处理,从而破坏了C的可移植性。

但是我们该如何解决呢?

C Coding Standard

中所述
  

使用'_'分隔符将#define和宏全部放入鞋面。宏使用大写,括号,并应避免产生副作用。宏名称前后的空格可以是任何空格,尽管TAB的使用应在文件中保持一致。如果它们是函数的内联扩展,则该函数全部用小写字母定义,宏具有相同的名称,全部用大写字母表示。如果宏是一个表达式,请将表达式括在括号中。

宏应始终用括号括起来以避免undefined behaviors和其他有害错误。

#define PRODUCT(x) ((x)*(x))  // Way better

总而言之,您不应该使用增量运算符(前增量和后增量)调用宏,因为这样很容易使您无法跟踪正在执行的操作,并且错误可能会堆积。