В glib c <= 2.23, почему `0;` используется в макросе mutex_lock? - PullRequest
2 голосов
/ 26 апреля 2020

Для glib c <= 2.23 </a> похоже, что в общем определении c для mallo c 'mutex_lock в качестве мьютекса используется int. 1 означает использование, а 0 означает бесплатное.

Он определяет этот общий c набор макросов:

typedef int mutex_t
# define mutex_init(m)          (*(m) = 0)
# define mutex_lock(m)          ({ *(m) = 1; 0; })
# define mutex_trylock(m)       (*(m) ? 1 : ((*(m) = 1), 0))
# define mutex_unlock(m)        (*(m) = 0)

Для mutex_lock(m), для каких целей 0; служит?

1 Ответ

3 голосов
/ 26 апреля 2020

Выражение ({ *(m) = 1; 0; }) является расширением G CC к стандартному C и называется выражением оператора . Это позволяет вам иметь несколько произвольных операторов внутри выражения.

Но все не пустые выражения должны приводить к значению, а для выражений операторов

[t] он последний в составной оператор должен быть выражением, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции

Так что последний 0; является просто результатом выражения.

...