首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中不可理解的类函数宏

C中不可理解的类函数宏
EN

Stack Overflow用户
提问于 2014-05-28 11:22:47
回答 3查看 159关注 0票数 1

我有这个c宏代码:

代码语言:javascript
复制
#define d(x, y, z) (    \
      x += z,               \
      y += x,               \
      x += y                \

)

我有几个问题:

  1. 这个宏函数会返回什么吗?(例如,返回x、y或z)还是它只是自己添加参数变量?(我认为这是无用的)。
  2. \是什么意思?
  3. 为什么最初的编码器在每次操作后都使用comma-operator?为什么不直接使用;而不是,呢?

如能提供任何帮助,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-28 12:02:01

首先,#define是一个预处理指令,这意味着当源代码/c代码被执行时,#define将用RHS替换LHS --这意味着无论使用哪一个d(x,y,z)都将被替换为给定的公式。

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

代码语言:javascript
复制
#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) -被a+=1,b+=2,c+=3取代

  1. \的意思是前处理器指令在下一行继续。
  2. 至于逗号操作符,我们需要查看源代码,看看它的确切用途。正如您在上面的代码中所看到的,逗号运算符实际上将所有三个变量分开,并且能够正确地打印--如果我用任何其他运算符替换逗号,我们将得到编译错误。

希望这能回答你的问题:)

问候哈里

票数 0
EN

Stack Overflow用户

发布于 2014-05-28 11:41:14

这个宏函数会返回什么吗?(例如,返回x、y或z)还是它只是自己添加参数变量?(我认为这是无用的)。

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

这是什么意思?

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

为什么最初的编码器在每次操作后都使用逗号操作符?为什么不直接用;代替‘,?

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

代码语言:javascript
复制
int x=1, y=2, z=3, f;
f = 3 * (d(x,y,z));

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

代码语言:javascript
复制
int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y);  // Evaluates to 3 * (the final value of x)

如果宏使用分号,代码将变成:

代码语言:javascript
复制
int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y);  // Syntax error!!!
票数 5
EN

Stack Overflow用户

发布于 2014-05-28 11:42:22

1)宏本身不返回任何内容。它只是一段愚蠢的代码,无论它在哪里遇到它,都会被预处理程序所取代。它可以是任何类型的文本。

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

3)不能对原编码器的意图作任何假设。但是,通过在其中使用逗号运算符,整个宏就变成了C语言表达式。例如,运行类似于此的东西(如果分号在里面的话就不会起作用了):

代码语言:javascript
复制
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);

和印刷品:

代码语言:javascript
复制
a = 10
x = 10
y = 6
z = 3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23910280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档