C4003:C++中宏的实际参数不足
C4003: Not enough actual parameters for macro in C++
看看这个
#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。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用