我正在编写一个包含许多断言的库。启用断言后,该库的运行速度要慢得多,并且整个库的要点在于它是快速的,因此断言仅在测试或诊断错误时才有意义。我使用的是autoconf,这似乎是标准的惯例,要求用户了解此问题并传递一个标志以配置以禁用断言。在这种情况下,只有专业用户才能知道安装适当版本的库的知识!那真的是我应该做的吗?如果是这样,除了“这是专家用户和其他程序员所期望的”之外,还有充分的理由吗?

编辑: Here's一个讨论示例,该示例说明您不应在 Release模式下默认定义NDEBUG,尽管没有其他原因,但这样做令人惊讶。

最佳答案

我想我已经知道了。定义NDEBUG的问题在于它可能导致未定义的行为。我的是一个模板库,其中包含一些非模板部分,因此我的代码可以内联到其他人的二进制文件中。如果我在编译非内联代码时定义了NDEBUG,然后在没有NDEBUG的情况下编译了客户端代码,则 header 中将存在两种不兼容的代码版本-一个带有断言,一个不带有断言。这会导致不确定的行为,而我本人也曾遇到此问题,这是一次神秘的崩溃。因此,我认为图书馆不应该定义NDEBUG-负责在给定计算机上编译所有内容的人或构建系统应该是决定NDEBUG的人。

但是,我不必定义NDEBUG只是为了使我的库在默认情况下无需声明即可运行。我现在有一个宏MYLIB_DEBUG和MYLIB_ASSERT。如果未定义MYLIB_DEBUG,则MYLIB_ASSERT(X)不执行任何操作。如果定义了MYLIB_DEBUG,则将MYLIB_ASSERT(X)定义为assert(X)。这使得断言选择加入而不会与NDEBUG发生冲突。

因此,我目前对我的问题的回答是,默认情况下,库可以关闭断言是可以的,如果您的接口(interface)具有任何包含断言的内联函数,则不要通过定义NDEBUG来做到这一点。

关于c++ - 库构建系统是否应默认关闭断言?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11694750/

10-13 08:11