Even een puur software vraagje, maar gezien hier toch de nodige embedded specialisten zitten vind ik hem hier wel passen.
Ik was even benieuwd of iemand misschien een oplossing weet.
Ik heb in mijn code de nodige debug prints over een uart, die zijn voor tracing cruciaal en erg handig. In de uiteindelijke release wil ik geen onzin voor een eind gebruiker geprint hebben.
Dat zit nu ongeveer zo in elkaar:
#ifdef ENABLE_DEBUG_PRINTS
printf("This string should only be printed if debug prints are enabled and with avriable arguments like %d and %08x",
counter, hexAddress);
#endif
Echter nu stata mijn code vol met dit soort regels en met name die #ifdefs maken de code lelijk en slechter leesbaar.
Het zou layout technisch veel mooier zijn als het gewoon een oneliner kan zijn.
Ik heb al een functie gemaakt waar de #ifdef in die functie zit. Zoals dit:
static void DebugPrint(const char* pStringFormat, ...) {
#ifdef ENABLE_DEBUG_PRINTS
va_list args;
va_start(args, pStringFormat);
printf(pStringFormat, args);
va_end(args);
#else
// Do nothing if ENABLE_DEBUG_PRINTS is not defined
(void)pStringFormat;
#endif
Dit werkt en houd de code een stuk overzichtelijker, echt het grootste nadeel hiervan is dat nu alle string literals toch altijd mee gecompileerd worden, ook al worden ze in de functie niet gebruikt.
Ik doe de (void)pStringFormat om een warning over een unused argument te suppressen, gezien ik daar geen suppress in de keil compiler voor kan vinden.
Ik wil al deze strings überhaubt niet meegecompileerd hebben indien de debug prints niet enabled zijn.
Iemand tips? Is het een kwestie van compiler configuratie of is het inherent aan deze oplossing.
Ik zat te denken om het met een macro op te lossen ipv met een functie, maar dan weet ik niet hoe dat te doen, gezien je bij een printf een variabele argument list hebt.
zou een inline functie hier nog iets aan bijdragen?