gpt4 book ai didi

c++ - C4003 : Not enough actual parameters for macro in C++

转载 作者:行者123 更新时间:2023-11-30 05:08:09 28 4
gpt4 key购买 nike

看看这个

#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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com