草庐IT

c++ - 重新定义断言是邪恶的吗?

重新定义assert宏是邪恶的吗?有些人建议使用您自己的宏ASSERT(cond)而不是重新定义现有的标准assert(cond)宏。但是,如果您有很多使用assert()的遗留代码,您不想对其进行源代码更改,想要拦截、规范化其断言报告,那么这无济于事。我已经做好了#undefassert#defineassert(cond)...myownassertcode...在上述情况下-代码已经使用断言,我想扩展断言失败的行为-当我想做类似的事情时1)打印额外的错误信息以使断言更有用2)在断言上自动调用调试器或堆栈跟踪...this,2),可以通过实现SIGABRT信号处理程序来完成,而无需

C++:为什么 const_cast 是邪恶的?

我一直听到这种说法,但我真的找不到const_cast邪恶的原因。在以下示例中:templatevoidOscillatorToFieldTransformer::setOscillator(constSysOscillatorBase&src){oscillatorSrc=const_cast*>(&src);}我正在使用引用,并且通过使用const,我可以保护我的引用不被更改。另一方面,如果我不使用const_cast,代码将无法编译。为什么const_cast在这里不好?同样适用于以下示例:templatevoidSysSystemBase::addOscillator(cons

c++ - const 迭代器在 C++14 中仍然是邪恶的吗

ScottMayers的“EffectiveSTL”中的第26项被标记为“Preferiteratortoconst_iterator,reverse_iterator和constreverseiterator”。原因是insert()和erase()的某些形式完全需要iterator并且从其他类型转换是乏味的并且容易出错。此外,比较iterator和const_iterator可能会出现问题,具体取决于STL实现。这本书出版于2001年。第26条中的建议在gcc的当前状态下是否仍然有效? 最佳答案 C++14标准(N3936)保证

python - 为什么全局变量是邪恶的?

已结束。此问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。关闭2年前。Improvethisquestion我试图找出为什么使用global在python中被认为是不好的做法(以及在一般编程中)。有人可以解释一下吗?包含更多信息的链接也将不胜感激。 最佳答案 这与Python无关;全局变量在任何编程语言中都是不好的。但是,全局常量在概念上与全局变量不同;全局常量是完全无害的。在Python中,两者之间的区别纯

c++ - 自由 operator->* 重载是邪恶的吗?

我在阅读refutingthenotion之后的第13.5节内置运算符不参与重载决议,并注意到没有关于operator->*的部分。它只是一个通用的二元运算符。它的兄弟operator->、operator*和operator[]都要求是非静态成员函数。这排除了将自由函数重载定义为运算符通常用于从对象获取引用。但是不常见的operator->*被省略了。尤其是operator[]有很多相似之处。它是二进制的(他们错过了使其成为n元的黄金机会),它在左侧接受某种容器,在右侧接受某种定位器。它的特殊规则部分13.5.5似乎没有任何实际效果,除了取缔自由函数。(而且这种限制甚至排除了对交换性

c++ - 为什么预处理器宏是邪恶的,有哪些替代方案?

我一直问这个,但我从来没有得到一个很好的答案;我想几乎所有程序员在写第一个“HelloWorld”之前都遇到过“永远不应该使用宏”、“宏是邪恶的”等短语,我的问题是:为什么?这么多年了,新的C++11有没有真正的替代品?简单的部分是关于宏,如#pragma,这是特定于平台和特定于编译器的,并且大多数时候它们都有严重的缺陷,例如#pragmaonce这在至少两种重要情况下容易出错:不同路径中的相同名称以及一些网络设置和文件系统。但总的来说,宏及其用法的替代方法呢? 最佳答案 宏就像任何其他工具一样-谋杀中使用的锤子并不邪恶,因为它是锤

php - 什么时候 eval 在 php 中是邪恶的?

在我从事PHP开发的这些年里,我一直听说使用eval()是邪恶的。考虑到以下代码,使用第二个(更优雅的)选项是否有意义?如果不是,为什么?//$typeistheresultofanSQLstatement,e.g.//SHOWCOLUMNSFROMa_tableLIKE'a_column';//henceyoucanbeprettysureabouttheconsistency//ofyourstring.$type="enum('a','b','c')";//optionone$type_1=preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#',

c++ - 断言是邪恶的吗?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭10年前。Go语言的创造者write:Godoesn'tprovideassertions.Theyareundeniablyconvenient,butourexperiencehasbeenthatprogrammersusethemasacrutchtoavoidthinkingaboutpropererrorhandlingandreporting.P

c++ - 巧妙破坏的 C++ 代码的邪恶样本

我需要一些不良C++代码示例来说明违反良好做法的情况。我想提出我自己的例子,但我很难提出不是人为的例子,并且陷阱不是立即显而易见的(这比看起来更难)。示例如下:不为具有std::auto_ptr成员的类定义复制构造函数,并使用具有前向声明类的std::auto_ptr成员。从构造函数或析构函数(直接或间接)调用虚函数。重载模板函数。带有boost::shared_ptr的循环引用。切片。从C回调中抛出异常(直接或间接)。等式的浮点比较。具有原始指针成员的构造函数的异常安全性。从析构函数中抛出。在不同架构上编译时整数溢出(size_t和int不匹配)。使容器迭代器失效。...或者你能想到

c++ - 巧妙破坏的 C++ 代码的邪恶样本

我需要一些不良C++代码示例来说明违反良好做法的情况。我想提出我自己的例子,但我很难提出不是人为的例子,并且陷阱不是立即显而易见的(这比看起来更难)。示例如下:不为具有std::auto_ptr成员的类定义复制构造函数,并使用具有前向声明类的std::auto_ptr成员。从构造函数或析构函数(直接或间接)调用虚函数。重载模板函数。带有boost::shared_ptr的循环引用。切片。从C回调中抛出异常(直接或间接)。等式的浮点比较。具有原始指针成员的构造函数的异常安全性。从析构函数中抛出。在不同架构上编译时整数溢出(size_t和int不匹配)。使容器迭代器失效。...或者你能想到