c++ - C、C++预处理器宏

标签 c++ c

谁能解释一下这是如何工作的

#define maxMacro(a,b) ( (a) > (b) ) ? (a) : (b) 

inline int maxInline(int a, int b)
{
  return a > b ? a : b;
}

int main()
{  
  int i = 1; j = 2, k = 0;
  k = maxMacro(i,j++); // now i = 1, j = 4 and k = 3, Why ?? Where is it incremented ?
  //reset values
  i = 1; j = 2, k = 0;
  k = maxInline(i,j++); // now i = 1, j = 3, and k = 2, Why ??
  return 0;
}

所以,我想知道 j 的值到底在哪里递增,同时检查 条件或返回时或调用时?

  • 一个。使用宏
  • b。使用内联方法

更新: 感谢大家,现在我明白了这一点。但出于好奇,为什么有人会在调用方法时执行 j++,为什么在调用方法后不增加 j,这样就不会那么困惑了。我在某处看到这段代码所以问它!!

最佳答案

问题是预处理器只对宏进行直接文本替换。

maxMacro(i, j++)

成为

( (i) > (j++) ) ? (i) : (j++)

如您所见,当 j 较大时,它会递增两次。

这正是您应该更喜欢内联函数而不是宏的原因。

关于c++ - C、C++预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263607/

相关文章:

c++ - 我们可以在系统 c 的敏感列表中给出输出端口变量吗?

c - fgetchar() 的功能是什么?使用标准输入之前是否需要刷新它?

在 C 中从二进制转换为 char

c++ - SDL libsdl1.2-dev

c - 使用 getchar() 和 putchar() 将 int 与字符串交换

将特定数组元素转换为整数值

c++ - 为什么我们应该只在类或函数 (C++) 中使用 'static'?

c++ - 将 glbinding 与 cmake 链接起来

python - 你如何将 Python cv2.cv.LoadImage 编码到 C IplImage->imageData 结构中

java - 如何将opencv代码转换为javacv代码