2014-09-09 2 views
-3

Я так часто встречался в общем коде stm32f0, и я не могу понять его. что это означает по приведенной ниже строке. Я знаю, что это сложно понять. Но моя точка зрения заключается в вопросительном знаке (?) в определении. Может кто-нибудь объяснить это."?" mark in C macro

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 
+2

'?:' - условный оператор. Кто-то называет это тройным оператором. –

+0

http://en.wikipedia.org/wiki/%3F:#C – Michael

+0

Если вы используете assert_param (a), этот макрос ничего не сделает, если a отличен от нуля, но напечатайте ошибку, если это так. А? e1: e2; является альтернативной формой if (a) {e1; } else {e2; } Макрос, подобный этому, часто используется, чтобы утверждать, что указатель не является нулевым указателем (который является нулевым). Он также может иметь вид (!! a)? e1: e2; для нормализации a. – midor

ответ

1

это короткая форма состояния, вы можете написать

int k = (i > j) ? i : j; 

это Asign я к к, если i > j иначе он будет Asign J. это путь мы выбираем между двумя вариантами внутри макроса

1

Здесь используется условный оператор. Он говорит, что если expr истинно, значение макроса assert_param (expr) будет равно нулю или иначе , он вызовет другой макрос или функцию assert_failed() с двумя параметрами в качестве входных данных. 1st is FILE макрос, который является именем файла, из которого был вызван макрос, а другой - LINE макрос, который является номером строки в файле, из которого был вызван макрос.

условный оператор Формат таков:

a?b:c 

Это означает, что если это верно, то Ь будет результат в противном случае с будет являться результатом. Соответственно, вы можете отделить эти выражения в выражении.

2

В C, реальная полезность этого является то, что это выражение вместо заявления; то есть вы можете иметь его в правой части (RHS) инструкции . Таким образом, вы можете писать некоторые вещи более кратко.

Источник: The ternary (conditional) operator in C

Ps. Я бы использовал комментарии, но это было невозможно из-за 50 репутационных ограничений.