¿Cómo separar la lógica de registro de la lógica de negocios en un programa en C? ¿Y en uno de C ++?

Actualmente estoy codificando en C y tengo muchas printfs para poder rastrear, en algunas ocasiones, el flujo de mi aplicación. El problema es que algunas veces quiero más detalles que otras, por lo que generalmente paso mi tiempo comentando / descomentando mi código C, para poder obtener la salida adecuada.

Cuando uso Java o C #, generalmente puedo separar tanto mi código de implementación de la lógica de registro mediante Aspects.

¿Existe alguna técnica similar que use en C para solucionar este problema?

Sé que podría poner una bandera llamada DEBUG que podría estar encendida o apagada, para no tener que dar vueltas y comentar / descomentar todo mi código cada vez que quiera mostrar u ocultar printfs. La pregunta es que también me gustaría deshacerme de la lógica de registro en mi código.

Si en lugar de C estaba codificando en C ++, ¿sería mejor?

Editar

Parece que hay un AspectC ++, por lo que para C ++ parece haber una solución. ¿Qué hay de C?

Gracias