- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看看这个
#define getFourth( _1,_2,_3, _4,... ) _4 //select the 4th parameter
#define some_type(x) type, x
getFourth
( some_type(1),
some_type(2),
some_type(3)
)
我认为它扩展为 getFourth(type, 1, type, 2, type, 3) 所以我们应该选择 2(因为 2 是第 4 个参数)。相反,我收到警告 “C4003 没有足够的实际参数用于宏‘getFourth’
”。 getFourth 似乎将 some_type(1) 视为第一个元素,将 some_type(2) 视为第二个元素,将 some_type(3) 视为第三个元素。由于它至少需要 4 个参数,所以我们收到了警告。有人可以建议如何解决吗?
最佳答案
I thought it expands to getFourth(type, 1, type, 2, type, 3) so we shall have 2 selected (since 2 is the 4th parameter)
宏不是这样工作的。宏扩展是从外向内发生的。此外,有两种扩展机会:(1) 在参数替换期间,(2) 在发生替换列表之后生成的替换列表。仅当宏中的参数对应于替换列表中的参数时才会发生参数替换扩展(并且该参数未使用 #
运算符进行字符串化或参与粘贴(##
)).
例如,如果我们有:
#define foo(b,c) b c
getFourth(some_type(1),some_type(2),some_type(3),foo(some_type,(4)),x)
那么getFourth
现在有5个参数,所以可以调用了。扩展的第一步是参数替换; getFourth 的替换列表是_4
,它只提到了一个参数。相应的参数是 foo(some_type,(4))
。因为 _4
没有被粘贴或字符串化,所以处理器可以计算 foo(some_type,(4))
。这导致 some_type (4)
,它进一步扩展为 type, 4
。所以现在,type, 4
替换了 _4
。我们完成了参数替换。
我们剩下 type, 4
。这里又进行了一次重新扫描,但在此步骤中没有任何反应。但请注意 some_type(1)
、some_type(2)
和 some_type(3)
不仅之前没有得到评估getFourth
,但它们根本没有得到评估,因为替换列表中没有任何内容提及它们。
Can someone please suggest how to fix it?
只要您要扩展的内容是 getFourth
的参数 1 到 3,它们甚至不会求值。但您可以将其设为一个带括号的列表,然后应用宏,使用类似于我在上面所做的技巧:
#define CALL(a,b) a b
CALL(getFourth,(some_type(1),some_type(2),some_type(3))).
现在,getFourth
和 (some_type(1),some_type(2),some_type(3))
只是 CALL
的参数,其中提到了两个参数。因此在参数替换期间,getFourth
本身“评估”(因为这不足以调用类对象宏,它就保持原样),并被放入 a
。 (some_type(1),some_type(2),some_type(3))
计算并放入 b
。该评估变为 (type, 1,type, 2,type, 3)
。所以你最终得到了 getFourth (type, 1,type, 2,type, 3)
。现在开始重新扫描,在此期间使用您期望的参数调用 getFourth。
关于c++ - C4003 : Not enough actual parameters for macro in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46985736/
我是一名优秀的程序员,十分优秀!