特定于Microsoft的__if_exists
语句的MSDN documentation表示以下内容(添加了重点):
不幸的是,没有解释为什么不应该将其应用于局部变量。它可以很好地编译并具有预期的效果,所以我想知道是否有人知道为什么他们说不这样做。是正确性问题,还是可维护性问题,还是其他?
我意识到这是Microsoft特有的功能,而不是可移植的,但是出于争论的缘故,让我们假设有充分的理由使用它。
编辑:有些人很好奇我为什么要这样做,所以这里有一个解释。我知道这是一个肮脏的技巧,因此,除非您有更好的建议,否则请不要烦恼指出这很麻烦。鉴于代码库很大,这是我们能找到的最便宜的替代方案。
我们拥有大量的遗留代码(数百万行),这些遗留代码使用Microsoft特定的__FUNCTION__
宏作为错误日志记录包的一部分。现在,该代码的很大一部分都包装在了lambda函数中,以便我们可以捕获结构化异常(使用__try
/ __except
),并且仍然使用不可展开的对象。在这些lambda函数中,__FUNCTION__
的计算结果像`anonymous-namespace'::<lambda23>::operator()
这样无用的东西,对任何事情都没有用。为此,我们的解决方法是使用__FUNCTION__
定义新的类似于__if_exists
的宏,该宏检查包含封闭函数名称的备用局部变量的存在。由于宏的工作方式,我们可以轻松切换到新的__FUNCTION__
替代项,并轻松定义备用名称变量,而无需更改大量代码,因此,鉴于这些限制,这是一个合理的解决方案。也就是说,当然,假设以这种方式使用__if_exists
是有效的。
就像我在上面说的,我知道这是一个肮脏的骇客,所以请不要告诉我这是多么丑陋,除非您对如何做得更好有个好主意。
最佳答案
我不确定,但是有一个猜测是局部变量可能会被编译器优化掉,当然可能不是,这使得__if_exists测试变得不可靠。
而且我也看不出对局部变量执行此操作的原因,您在特定范围内,您了解所有情况,为什么要测试局部变量是否存在?