如何确保不使用变量
How to make sure that a variable is not used
问题
我有一个函数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
}}
这是最好的解决方案吗?可能不会,像另一个答案中那样省略函数名可能是一个更好的主意。这只是某种概念的证明,可能不应该在现实生活中使用,因为可能还有其他选择。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 确保我们仅一次和一次初始化每个变量
- 如何确保函数在全局变量的任何 ctor 之前执行
- 确保全局变量的初始化顺序正确
- 如何确保变量在不同的线程读取它们之前存储到内存中
- 确保c++中静态变量的构造和销毁顺序
- 互斥锁如何确保变量的值在内核之间保持一致?
- 如何确保在优化过程中不删除局部变量
- c++:如何确保所有变量都被初始化
- 是否有一种方法来确保数组变量(unsigned int*)将在内存中
- 确保全局范围的静态变量在任何地方都存在