我正在编写一个包含许多断言的库。在断言打开的情况下,库速度要慢得多,而且库的整个点就是它很快,因此断言只在测试或诊断错误时才有意义。我正在使用autoconf,似乎是标准做法要求用户知道这个问题并传递一个标志来配置禁用断言。在这种情况下,只有专家用户才能知道足够的安装适当版本的库!这真的是我应该做的,如果是这样,除了“这是专家用户和其他程序员期望的那样吗?”之外还有充分的理由吗?
编辑: Here's一个讨论示例,说明您不应在发布模式下默认定义NDEBUG,但没有其他理由,因为这样做很令人惊讶。< / p>
答案 0 :(得分:0)
如果使用assert使您的库缓慢按照您的意愿执行并将其关闭。确保清楚地记录下来......并且不要担心。
答案 1 :(得分:0)
我想我现在已经弄明白了。定义NDEBUG的问题在于它可能导致未定义的行为。我是一个带有一些非模板部分的模板库,因此我的代码被内联到其他人的二进制文件中。如果我在编译非内联代码时定义NDEBUG,然后在没有NDEBUG的情况下编译客户端代码,那么将从头文件中获得两个不兼容的代码版本 - 一个带有断言,一个没有。这导致了不确定的行为,我曾经遇到过这个问题,就像我之前的一次神秘崩溃一样。所以我认为库不应该定义NDEBUG - 负责编译给定计算机上所有内容的人或构建系统应该是决定NDEBUG的人。
但是,我没有必要定义NDEBUG只是为了让我的库在没有断言的情况下默认运行。我现在有一个宏MYLIB_DEBUG和MYLIB_ASSERT。如果未定义MYLIB_DEBUG,则MYLIB_ASSERT(X)不执行任何操作。如果定义了MYLIB_DEBUG,则MYLIB_ASSERT(X)被定义为assert(X)。这使断言选择加入而不会弄乱NDEBUG。
所以我目前对我的问题的回答是,默认情况下库可以关闭断言,如果你的接口有任何包含断言的内联函数,就不要通过定义NDEBUG来做到这一点。