C ++, 205 179 byte
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;//
(Nessuna nuova riga finale: quando viene copiata, la prima riga della copia e l'ultima riga dell'originale devono coincidere)
Fondamentalmente, questo funziona creando una sequenza di variabili statiche che, durante la costruzione, incrementano un contatore di variabili globali. Quindi, alla distruzione, se il contatore non è 0, fa tutto il suo output e imposta il contatore su zero.
Per definire una sequenza di variabili senza conflitti di nomi, utilizziamo la macro spiegata come segue:
#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.
che si basa in qualche modo sulle stranezze del processore di stringhe. Usiamo zmolte volte per definire classi / variabili che non entreranno in conflitto tra loro quando copiate su righe separate. Inoltre, le definizioni che devono essere presenti una sola volta vengono inserite nella prima riga, che viene commentata in copie del codice. Le dichiarazioni #definee #includenon si preoccupano che vengano ripetute, quindi non è necessario alcun trattamento speciale.
Questo codice presenta anche un comportamento indefinito nell'istruzione:
printf("%d %o %x",--c,c,c)
poiché non ci sono punti di sequenza, ma c viene modificato e vi si accede. LLVM 6.0 fornisce un avviso, ma lo compila come desiderato - che --cvaluta prima c. Si potrebbe, a scapito di due byte, aggiungere l'istruzione --c;prima che le uscite e il cambiamento --cin printfa c, che sarebbe sbarazzarsi di avvertimento.
Sostituito std::coutcon il printfsalvataggio di 26 byte grazie a un suggerimento di mio fratello.
1 01 0x1? (Include prefissi)