2

单步执行时sqlite3_stmt,我想检查返回值NULL而不是存储它并检查存储的值。

这就是我现在正在做的事情:

char *email = (char *)sqlite3_column_text(statement, 10);
if (email == NULL) email = "";

这是我想做,减去双重调用column

char *email = ((char *)sqlite3_column_text(statement, 10)) ? (char *)sqlite3_column_text(statement, 10) : "";

有什么方法可以更简洁地表达第二个表达式吗?我必须重复做很多这些,所以我正在寻找简洁。

我知道这是控制流的问题,而不是 SQLite API 本身的问题,但是你有它。我想不出一个好的方法来做到这一点。

4

2 回答 2

5

C的GNU 扩展允许三元条件运算符评估其条件是否为真并且第一个分支中没有任何内容:

char *email = (char *)sqlite3_column_text(statement, 10);
email = email ? : "";

或者,更确切地说,你说你在找什么

char * email = (char *)sqlite3_column_text(statement, 10) ? : "";

这在使用 Clang 编译时也有效。

另一种可能性是:

char *email = (char *)sqlite3_column_text(statement, 10);
email = (NULL == email) ? email : "";

但我认为我建议您选择第一个选项。如果您经常这样做,请制作一个代码片段。

于 2013-02-27T20:15:09.667 回答
2

这行得通吗?

char *email;
// Reviewed by "R." to verify sequence point correctness.
email = (email = (char *)sqlite3_column_text(statement, 10))? email : "";
于 2013-02-27T20:23:05.230 回答