¿Qué hace el siguiente código?

static void llist_dtor(void *user, void *element) { (void)user; (void)element; /* Do nothing */ } 

¿Es función de no operación? Entonces, ¿por qué se realiza el casting? ¿Está bien pasar NULL como uno de sus parámetros?

Eso es de hecho un no-op. Las conversiones a (void) están aquí para evitar que se generen advertencias de “parámetros nunca utilizados” con algunos comstackdores (las conversiones se optimizan, pero los parámetros aún se consideran “usados”).

Puede pasar NULL ya que los parámetros se ignoran de todos modos.

Sí, esta es una función sin operación.

El casting es un truco común para evitar que el comstackdor se queje de los parámetros no utilizados.

Sí, esta es una función de no operación y las líneas void se colocan para evitar la advertencia de “parámetro no utilizado”. Para gcc, busque “no utilizado” en la página: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Sin embargo, si fuera C ++ en lugar de C , probablemente lo escribiría de forma un poco diferente a

 static void llist_dtor( void * /* user */, void * /* element */ ) { /* Do nothing */ } 

Tenga en cuenta que los nombres de las variables están comentados.

Eso no es no-op. Así le dices al comstackdor que ignore esos dos argumentos.