当前位置: 首页 > 知识库问答 >
问题:

c++ - 关于宏定义的问题,#define N1(a,b) N2(c,d) 如何展开的?

方鸿羲
2023-08-29

写 c++ 的时候还是在学校,后来一直js,c#。现在转 c++,好多宏看不明白。比如下面的:
image.png
问题 1:
宏定义里出现函数名?宏函数不是这样的么:#define SQUARE(x) (x*x)
上面的

#define PROFILER_BEGIN(INFO, OBJECT_PTR) profiler_begin_object (&INFO, OBJECT_PTR)profiler_begin_object 是一个函数名,大概这样子 void profiler_begin_object(a,b){ }

那上面的宏展开是什么啊?
问题 2:宏定义里怎么出现数据类型了
还有下面这种,ProfilerAutoObject 是一个 struct 类型,所以这是返回类型?而且这里的宏定义怎么用分号结尾了?
image.png
问题 3:宏定义能放在一行?而且这里的宏体在哪,没看到这种表达式啊 (x*x)
下面这四个宏定义,为什么一行出现多个宏名?
image.png
问题 4:宏定义里怎么出现成员运算符了?
image.png

共有1个答案

司马萧迟
2023-08-29

宏展开是文本替换。什么函数,运算符啥的,在宏替换阶段都不存在。

所以,
#defint A(x) foo(x) 就是把 A(x) 替换成 foo(x) ,把 A(1) 替换乘 foo(1) 。至于怎么解释 foo ,那是宏替换之后的事,它可能是一个函数,一个变量,一个类型,都与宏展开无关。只有但 foo 是另一个宏的时候,会触发另一个宏的进一步展开。

 类似资料:
  • 本文向大家介绍问题:A+B∗(C−D)/E的后缀表达式。相关面试题,主要包含被问及问题:A+B∗(C−D)/E的后缀表达式。时的应答技巧和注意事项,需要的朋友参考一下 参考回答: ABCD-*E/+ 解析: 转换过程需要用到栈,具体过程如下: 1)如果遇到操作数,我们就直接将其输出。 2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。 3)如果遇到一个右括号,则将栈元素弹出

  • 本文向大家介绍在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d,包括了在数组中找到四个元素a,b,c和d,以便在C ++中a + b = c + d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个整数列表。我们的任务是找到四个不同的整数,分别为(a,b)和(c,d)两对,这样a + b = c + d。如果有多个答案,则仅打印一个。假设数组元素像:A = [7

  • 本文向大家介绍在数组中找到最大的d,使得C ++中的a + b + c = d,包括了在数组中找到最大的d,使得C ++中的a + b + c = d的使用技巧和注意事项,需要的朋友参考一下 假设我们有一组整数。我们必须找到一个数字“ d”,其中d = a + b + c,并且必须最大化(a + b + c),所有a,b,c和d都存在于集合中。该集合将至少容纳一个元素,最多可容纳1000个元素。每

  • 任务给你一个排序的整数数组arr。它包含几个唯一的整数(负、正或零)。 您的任务是找到最大的d,使得a b c=d,其中a、b、c和d是arr的不同元素。如果没有找到这样的元素d,则返回null。 例子: 对于arr=[2,3,5,7,12],输出应该是12(这个数组正确传递了我的函数) 对于arr=[-100,-1,0,7,101],输出应该是0(这个不通过) 我可以进行正数检查,但我的函数因负

  • 我有两个双向量。双的值在-1000到1000之间。 两个向量包含相同的数字,但顺序不同。 例如 假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等: 我担心双重不精确。

  • 题目描述 这是今晚阿里巴巴笔试编程题的其中一道。原题描述如下: 对于任何整数 $x$,一定存在整数对 $(a, b)$,使得 $x \oplus a \oplus b$ 最大。其中,$\oplus$ 表示异或,$0≤x,a,b≤2^{31}-1$。给定一个 $x$,输出使得 $\vert a-b\vert $ 最小的 $(a, b)$ 对的个数。 示例: 输入 0,输出 2 输入 100,输出 1