如何确保不使用变量

How to make sure that a variable is not used

本文关键字:变量 确保 何确保      更新时间:2024-09-26

问题

我有一个函数f,它采用了一些参数a,我如何确保变量a不会在主体内部使用,在最好的情况下,通过编译错误使用?例如,以下内容不应编译

void f( int & a ) {
UNUSED( a );  // some magic rendering the variable a unusable
++a;
}

问题的故事:

在我的一些函数中,有些变量在发布模式下编译时未使用,在调试模式下使用。因此,为了消除警告,我为自己制作了一个UNUSED( varname )宏。但后来,我意识到宏的正确名称应该是MAYBE_UNUSED( varname )

UNUSED()用例

我有一组(难以计算的(函数的实现。所有实现都应具有相同的签名,因此可以很容易地相互替换。但是有些实现不能使用某些输入参数。为了使这一点明确(对于读者和编译器(,这样的UNUSED魔术将是有用的。

C++允许您拥有未命名的函数参数。它在不打算使用相应参数,但必须声明它以匹配签名的情况下非常有用,例如在向某个库写入回调时。

只需重新定义您的功能:

void f(int&) {
// code ...
}

虽然@Jorengarena的答案可能是你想要的,但这个想法仍然让我感兴趣。这是我能做的最接近的事情。它利用了这样一个事实,即作用域中的变量会遮蔽外部作用域中同名的变量。现在是:

#define UNUSED(var_name) 
class UnusedClass_ {} var_name

嗯。。。这很简单,不是吗?然而,这是一个在实际函数中使用它的例子,在这个例子中,你会看到强加给你的轻微烦恼:

#define UNUSED(var_name) 
class UnusedClass_ {} var_name
void f(int &a)
{{
UNUSED(a);
++a; // error: no match for 'operator++' (operand type is 'f(int&)::UnusedClass_')
}}

注意到额外的支架了吗?您知道,我们必须在另一个作用域中创建一个类型为UnusedClass_的新对象。现在每当我们提到a时,都是UnusedClass_a遮蔽了int &a。我们不能省略大括号;如果我们这样做,我们将得到一个重新定义a的错误。现在的实际工作方式是,UnusedClass_只是一个空类,因此没有运算符可以处理它,并且您可能无法将它放在任何函数参数中(除非它可能是一个对其参数不起任何作用的模板函数(。在大多数的情况下,这应该会给出一个错误。a;不会,而且可能有一些方法可以让这个类/宏做一些它不应该做的事情

您还可以放置一个只有变量名的空语句,以断言变量确实存在:

#define UNUSED(var_name) 
(void) var_name;     
class UnusedClass_ {} var_name
void f(int &a)
{{
UNUSED(b); // error: 'b' was not declared in this scope
}}

这是最好的解决方案吗?可能不会,像另一个答案中那样省略函数名可能是一个更好的主意。这只是某种概念的证明,可能不应该在现实生活中使用,因为可能还有其他选择。