C语言中不可理解的函数式宏

时间:2014-05-28 11:22:47

标签: c function macros

我有这个c宏代码:

#define d(x, y, z) (    \
      x += z,               \
      y += x,               \
      x += y                \

)

我有几个问题:

  1. 这个宏函数会返回什么吗? (例如,返回x,y或z) 或者只是自己添加参数变量? (是的 没用,我想)。
  2. \的含义是什么?
  3. 为什么原始编码器在每次操作后都使用comma-operator?为什么不使用;代替,
  4. 任何帮助将不胜感激

3 个答案:

答案 0 :(得分:5)

  

这个宏函数是否返回了什么? (例如,返回x,y或z)或者只是自己添加参数变量? (我觉得这没用,)。

它修改变量的值。 “返回”值是x的最终值。

  

\是什么意思?

当放在最后一行时,它会否定换行符,以便宏定义可以跨越多行。

  

为什么原始编码器在每次操作后都使用逗号运算符?为什么不使用;代替`,?

宏替换文字。请考虑以下代码:

int x=1, y=2, z=3, f;
f = 3 * (d(x,y,z));

如果宏使用逗号,则代码变为:

int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y);  // Evaluates to 3 * (the final value of x)

如果宏使用分号,则代码变为:

int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y);  // Syntax error!!!

答案 1 :(得分:2)

1)宏本身不返回任何内容。它只是一个愚蠢的代码,只要它遇到它就会被预处理器替代。它可以是任何类型的文本。

2)\用于让预处理器知道当前宏也会扩展到下一行。 (多行宏)

3)我无法对原始编码人员的意图做出任何假设。但是,通过在那里使用逗号运算符,整个宏成为C语言表达式。例如,运行这样的东西是有效的(如果分号在那里就不会有):

int a = 0;

int x = 1;
int y = 2;
int z = 3;

a = d(x, y, z);

printf("a = %d\n", a);
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("z = %d\n", z);

并打印:

a = 10
x = 10
y = 6
z = 3

答案 2 :(得分:0)

首先#define是一个预处理器指令,这意味着当编译源代码/ c代码时,#define将LHS替换为RHS - 意味着无论使用何种d(x,y,z)都将替换为等式

例如下面的c代码将打印 - 修改a = 9,b = 8,c = 9

#define d(x,y,z) \
    x+=1,       \
    y+=2,       \
    z+=3       


#include <stdio.h>

 int main()
 {
    unsigned int a,b,c;
    a=5;
    b=6;
    c=7;

    printf("modified a = %d, b=%d, c=%d \n",d(a,b,c));    
}

基本上这里发生的是d(a,b,c) - 被替换为+ = 1,b + = 2,c + = 3

  1. \的含义是预处理器指令在下一行继续。
  2. 就逗号运算符而言,我们需要查看源代码以查看它的确切使用位置。正如你在上面的代码中看到的那样,逗号运算符实际上将所有三个变量分开并且能够正确打印 - 如果我用任何其他运算符替换逗号,我们将得到编译错误。
  3. 希望这能回答你的问题:)

    此致 哈