【发布时间】:2017-11-10 19:18:25
【问题描述】:
在尝试从source 编译xtrabackup 时,我在sql/sql_acl.cc 中发现了一段特殊的代码行,GCC 拒绝在没有更宽松设置的情况下进行编译。这行是问题所在:
if (combo->plugin.str == NULL || combo->plugin.str == '\0')
立即引发以下错误:
错误:ISO C++ 禁止指针和整数之间的比较
考虑到有问题的代码,这似乎完全合理。 plugin 值属于这种类型:
struct st_mysql_lex_string
{
char *str;
size_t length;
};
这是一个简单的 MySQL 内部结构,表示字符串指针 + 长度对,所以在这种情况下,str 只是char*,没什么特别的。
我知道跨平台开发和处理巴洛克式编译器环境可能需要一定程度的偏执狂,但是如果有的话,这种双重 NULL 检查的理由是什么?我想不出如果第一个子句不是,第二个子句怎么会是真的,但我可能会遗漏一些不寻常的边缘情况。
【问题讨论】:
-
C++
nullptr也许? -
看起来像一个错误。
if声明对我来说没有多大意义。 -
GCC->g++ 也许?
-
大概是这样设计的吧?
if (combo->plugin.str == NULL || *combo->plugin.str == '\0')仅在不为空时取消引用? -
看起来他们可能在其他地方也有同样的错误,比较指向
'\0'的指针。它说明了为什么我们可以从一开始就使用nullptr。
标签: c++ gcc cross-platform