C ++, 205 179 octets
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;//
(Pas de nouvelle ligne de fin - une fois copiée, la première ligne de la copie et la dernière ligne de l'original doivent coïncider)
Fondamentalement, cela fonctionne en créant une séquence de variables statiques qui, lors de la construction, incrémentent un compteur de variables globales. Ensuite, lors de la destruction, si le compteur n'est pas 0, il fait toute sa sortie et remet le compteur à zéro.
Afin de définir une séquence de variables sans conflits de noms, nous utilisons la macro expliquée comme suit:
#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.
qui s'appuie un peu sur les caprices du processeur de chaînes. Nous utilisons zplusieurs fois pour définir des classes / variables qui n'entreront pas en conflit lorsqu'elles seront copiées sur des lignes distinctes. De plus, les définitions qui ne doivent apparaître qu'une seule fois sont placées sur la première ligne, qui est commentée dans des copies du code. Les instructions #defineet #includene se soucient pas qu'elles soient répétées, donc ne nécessitent aucune manipulation particulière.
Ce code présente également un comportement non défini dans l'instruction:
printf("%d %o %x",--c,c,c)
car il n'y a pas de points de séquence, mais c est modifié et accessible. LLVM 6.0 donne un avertissement, mais le compile comme vous le souhaitez - qui --cévalue avant c. On pourrait, au détriment de deux octets, ajoutez l'instruction --c;avant que les sorties et les changements --cdans printfla c, qui se débarrasser de l'avertissement.
Remplacé std::coutpar une printfsauvegarde de 26 octets grâce à une suggestion de mon frère.
1 01 0x1? (Comprend les préfixes)