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

2番目の表現をより簡潔に表現する方法はありますか?私はこれらの多くを繰り返し行う必要があるので、簡潔さを探しています。

これはSQLiteAPI自体の問題ではなく、制御フローの問題であることを私は知っていますが、そこにあります。私はこれを行うための良い方法を考えることができません。

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 に答える