我想我现在已经想通了。定义 NDEBUG 的问题在于它可能导致未定义的行为。我的是一个包含一些非模板部分的模板库,所以我的代码被内联到其他人的二进制文件中。如果我在编译非内联代码时定义了 NDEBUG,然后在没有 NDEBUG 的情况下编译了客户端代码,那么标头中的代码将有两个不兼容的版本——一个带有断言,一个没有。这会导致未定义的行为,我曾经遇到过这个问题,因为我遇到过一次神秘的崩溃。所以我不认为图书馆应该定义 NDEBUG - 负责在给定计算机上编译所有内容的人或构建系统应该是决定 NDEBUG 的人。
但是,我不必定义 NDEBUG 只是为了让我的库在没有断言的情况下默认运行。我现在有一个宏 MYLIB_DEBUG 和 MYLIB_ASSERT。如果 MYLIB_DEBUG 未定义,则 MYLIB_ASSERT(X) 什么也不做。如果定义了 MYLIB_DEBUG,则 MYLIB_ASSERT(X) 定义为 assert(X)。这使得断言选择加入而不会弄乱 NDEBUG。
所以我目前对我的问题的回答是,默认情况下库可以关闭断言,如果你的接口有任何包含断言的内联函数,就不要通过定义 NDEBUG 来做到这一点。