C ++ 205 179 Bytes
int main(){};static int c=1;
#define v(x) A##x
#define u(x) v(x)
#define z u(__LINE__)
#include <cstdio>
class z{public:z(){++c;};~z(){if(c){printf("%d %o %x",--c,c,c);c=0;}}}z;//
(Keine nachgestellte neue Zeile - beim Kopieren sollten die erste Zeile der Kopie und die letzte Zeile des Originals übereinstimmen.)
Grundsätzlich funktioniert dies, indem eine Folge von statischen Variablen erstellt wird, die beim Aufbau einen globalen Variablenzähler inkrementieren. Wenn der Zähler bei der Zerstörung nicht 0 ist, wird die gesamte Ausgabe ausgeführt und der Zähler auf Null gesetzt.
Um eine Folge von Variablen ohne Namenskonflikte zu definieren, verwenden wir das Makro, das wie folgt erklärt wird:
#define v(x) A##x //This concatenates the string "A" with the input x.
#define u(x) v(x) //This slows down the preprocessor so it expands __LINE__ rather than yielding A__LINE__ as v(__LINE__) would do.
#define z u(__LINE__)//Gives a name which is unique to each line.
was etwas von den Macken des String-Prozessors abhängt. Wir verwenden zviele Male, um Klassen / Variablen zu definieren, die nicht miteinander in Konflikt stehen, wenn sie in separate Zeilen kopiert werden. Außerdem werden die Definitionen, die nur einmal vorkommen müssen, in die erste Zeile gestellt, die in Kopien des Codes auskommentiert ist. Die #defineund #include-Anweisungen kümmern sich nicht darum, dass sie wiederholt werden, daher ist keine besondere Behandlung erforderlich.
Dieser Code zeigt auch undefiniertes Verhalten in der Anweisung:
printf("%d %o %x",--c,c,c)
da es keine Sequenzpunkte gibt, aber c geändert wird und zugegriffen wird. LLVM 6.0 gibt eine Warnung aus, kompiliert sie jedoch wie gewünscht - --cdie zuvor ausgewertet wurde c. Man könnte auf Kosten von zwei Bytes, fügen Sie die Anweisung --c;vor den Ausgängen und Änderung --cin printfan c, die der Warnung loswerden würde.
Ersetzt std::coutdurch printfSpeichern von 26 Bytes dank eines Vorschlags meines Bruders.
1 01 0x1? (Beinhaltet Präfixe)