printf, logcat-und \n
Habe ich C-code, der verwendet Drucke mit etwas clever ist wie
printf("hello ");
//do something
printf(" world!\n");
welche Ausgänge
Hallo Welt!
Ich wiederverwenden möchten, dass code mit Android und iOS, aber Log.d() und NSLog() effektiv fügen Sie einen Zeilenumbruch am Ende von jedem string den ich Ihnen übergeben, so dass die Ausgabe dieses Codes:
NSLog(@"hello ");
//do something
NSLog(@"world!\n");
kommt (mehr oder weniger) als:
Hallo
Welt!
Ich bin bereit, Sie zu ersetzen printf mit einigen makro zu machen, Melden.d und NSLog emulieren printf ist die Behandlung von '\n'; irgendwelche Vorschläge?
NSLog
soll nicht ein Ersatz fürprintf
,printf
Drucke zustdout
währendNSLog
wird für die Protokollierung verwendet, um zu sagen, dass eine log-Datei usw.- Ich weiß. Meine Frage ist, wie kann ich die Umleitung C-code printf mobile Protokolle, ohne zu brechen Funktionalität? Ich weiß, einige extra code nötig wäre.
- Zitat von <android/log.h> Dokumentation: "* Beachten Sie, dass ein newline-Zeichen ("\n") wird automatisch angehängt, um Ihre * log-Meldung, wenn nicht bereits vorhanden. Es ist nicht möglich, sendet mehrere * Nachrichten erscheinen und Sie auf eine einzelne Zeile im logcat."
Du musst angemeldet sein, um einen Kommentar abzugeben.
One-Lösung, die funktionieren könnte, ist die Definition einer globalen log-Funktion, die nicht flush den Puffer, bis es findet ein Zeilenumbruch.
Hier ist eine (sehr) einfache version in java für android:
Es ist völlig ungetestet, aber Sie bekommen die Idee.
Dieses Skript hat einige performance-Probleme. Es könnte besser sein, um zu überprüfen, ob nur das Letzte Zeichen ein Zeilenumbruch ist beispielsweise.
Ich erkannte, dass Sie wollte, dass dieser in C. Es sollte nicht allzu schwer sein, Anschluss obwohl ein standard-lib würde nicht Schaden (um Sachen wie einen string-Puffer).
Nachkommen, diese ist, was ich getan habe: store angemeldet strings in einem Puffer, und drucken Sie den Teil vor dem Zeilenumbruch, wenn es ein newline in die Puffer.
Ja, das NDK logcat ist dumm darüber. Es gibt Möglichkeiten zum umleiten von stderr/stdout an logcat, aber es gibt Nachteile müssen entweder "adb shell setprop", die nur für gerootete Geräte, oder dup (), wie Technik, sondern erstellen einen thread nur für diesen Zweck, ist nicht eine gute Idee, auf embedded-Geräten IMHO wenn Sie können, schauen Sie weiter unten für diese Technik).
So, ich habe meine eigene Funktion/Makros für diesen Zweck. Hier sind die snippets. In einem debug.c, dies zu tun:
Dann im debug.h hierzu:
Nun, die Sie gerade brauchen, um Debuggen.hpp-und call-LOGI() mit einem printf-ähnlichen semantischen gepuffert, bis ein '\n' aufgetreten ist (oder der Puffer voll ist).
Dies ist nicht perfekt, obwohl, wie wenn der string generiert, das von einem Aufruf der länger ist als der Puffer, wird es abgeschnitten und ausgegeben. Aber ehrlich gesagt, 1024 chars sollten genug sein, in den meisten Fällen (sogar weniger als diese). Wie auch immer, wenn dies geschieht, wird die Ausgabe einer Warnung, so dass Sie es wissen.
Beachten Sie auch die vsnprintf() ist keine standard-C - (aber es funktioniert im Android-NDK). Wir verwenden könnten, vsprintf() statt (das ist standard), aber es ist zu gefährlich, auf Ihre eigenen.
======================================================================
Nun für das dup () - Technik, können Sie sich hier (James Moore Antwort).
Dann Sie können loszuwerden, die obige Funktion, und definieren Sie Ihr makro als:
ist und du bist fertig.
Vorteile:
Nachteile:
Konnte man immer so bauen das string-segment an eine Zeit: