2013-02-27 4 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) : ""; 

Есть каким-то образом более кратко выразить второе выражение? Я должен много повторять, поэтому я ищу краткость.

Я знаю, что это проблема управления потоком, а не проблема с самим API SQLite, но там у вас это есть. Я не могу придумать хороший способ сделать это.

+0

Там _must_ быть другим вопросом об этом, но я просто не могу его найти. –

ответ

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

Это очень удобное расширение, о котором нужно знать. У вас есть ссылка для документации? –

+0

[Условные обозначения с опускаемыми операндами] (http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Conditionals.html#Conditionals) –

+0

@ RichardJ.RossIII: Добавлен в мой пост. –

2

Это работает?

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

Я бы этого не делал, потому что, увидев это, я провел не менее 30 секунд, проверяя, что правила последовательности не были нарушены. Это пустая трата времени читателя. –

+0

(Там я исправил это ... так что следующий читатель не должен тратить 30 секунд на повторную проверку) – abelenky

+2

Ха-ха хорошо +1 за то, что я смеюсь. –

Смежные вопросы