定义此C宏的正确方法是什么?

roh*_*hpr 2 c

#include <stdio.h>
#define ABS(a)  (a) < 0 ? -(a) : (a)
int main(void)
{
  printf("%d\n", ABS(-3) + 1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码片段来自赫伯特·希尔特(Herbert Schildt)的书,看起来它会产生输出4但实际上是打印出来的3.为什么?

我如何解决它?

M.M*_*M.M 5

正确的方法是使用一个inline函数,_Generic为每个类型支持一个大小写.否则你会评估a两次.

代替它,您可以通过在宏中括起表达式来修复它.这一直是防止这类问题的好主意.

#define ABS(a) ((a) < 0 ? -(a) : (a))
Run Code Online (Sandbox Code Playgroud)

问题来自因为X ? Y : Z + 1手段X ? Y : (Z + 1).