C4003:C++中宏的实际参数不足

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

本文关键字:参数 C++ C4003      更新时间:2023-10-16

看看这个

#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是第四个参数)。相反,我收到了一个警告"C4003 not enough actual parameters for macro 'getFourth"。看来getFourth是将some_type(1)作为第一个元素,将sometype(2)作为第二个元素,并将some_type(3)作为第三个元素。由于它预计至少有4个参数,因此我们收到了警告。有人能建议一下怎么修吗?

我认为它扩展到getFourth(type,1,type,2,type,3),所以我们应该选择2(因为2是第四个参数)

宏不是这样工作的。宏扩展是由外向内进行的。此外,还有两种扩展机会:(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之前没有得到评估,而且它们根本没有得到评估,因为替换列表中没有提到它们。

有人能建议如何修复它吗

只要你想展开的是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中。CCD_ 24进行评估并被放入CCD_。该评估变为(type, 1,type, 2,type, 3)。所以你最终得到了getFourth (type, 1,type, 2,type, 3)。现在进行重新扫描,在此过程中使用您期望的参数调用getFourth。