当我在以下代码中将函数用作宏时,它会通过空运行给出我无法获得的输出。
我尝试查找运算符的优先级图表,但无济于事。
#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。
答案 0 :(得分:-4)
宏与C ++中的等效inline
函数相同。它们通过将“函数调用”扩展为用预处理指令#define
编写的实际代码来工作。
这是棘手的地方,它们扩展为ad-literam代码,因此对于定义的宏:
#define PRODUCT(x) (x*x)
“呼叫” PRODUCT(i++)
的等效代码为
i++ * i++
解析为undefined behavior
。之所以会调用此错误,是因为某些编译器将对此进行不同的处理,从而破坏了C的可移植性。
但是我们该如何解决呢?
中所述使用'_'分隔符将#define和宏全部放入鞋面。宏使用大写,括号,并应避免产生副作用。宏名称前后的空格可以是任何空格,尽管TAB的使用应在文件中保持一致。如果它们是函数的内联扩展,则该函数全部用小写字母定义,宏具有相同的名称,全部用大写字母表示。如果宏是一个表达式,请将表达式括在括号中。
宏应始终用括号括起来以避免undefined behaviors
和其他有害错误。
#define PRODUCT(x) ((x)*(x)) // Way better
总而言之,您不应该使用增量运算符(前增量和后增量)调用宏,因为这样很容易使您无法跟踪正在执行的操作,并且错误可能会堆积。