2013-02-27 69 views
2

当逐步通过sqlite3_stmt时,我想检查返回值NULL而不是存储它并检查存储的值。有条件地设置一个变量,如果它是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本身的问题,但是你有它。我想不出一个好办法来做到这一点。

+0

还有另外一个问题,但我找不到它。 – 2013-02-27 20:17:42

回答

5

一个GNU extension to C使三元条件操作符来评估它的条件,如果这是真的,并没有什么在第一个分支:

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 : ""; 

但我想我会建议只是你的第一选择会。做一个代码片段,如果你做了很多。

+0

这是一个非常方便的扩展知道。你有它的文档链接? – 2013-02-27 20:25:00

+0

[条件与省略操作数](http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Conditionals.html#Conditionals) – 2013-02-27 20:31:07

+0

@ RichardJ.RossIII:已添加到我的文章。 – 2013-02-27 20:31:42

2

这是行不通的吗?

char *email; 
// Reviewed by "R." to verify sequence point correctness. 
email = (email = (char *)sqlite3_column_text(statement, 10))? email : ""; 
+0

我会避免这样做,因为当我看到它时,我花了至少30秒的时间来验证没有违反顺序点规则。这是浪费读者的时间。 – 2013-02-27 20:32:33

+0

(在那里,我修好了...所以下一个读者不必花费30秒重新验证) – abelenky 2013-02-27 20:34:15

+2

哈哈好吧+1让我笑。 – 2013-02-27 20:38:19

相关问题