рдЫреЛрдЯрд╛ рдпрд╛ рдмрдбрд╝рд╛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг C / C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо

рд╣реИрдмрд░рдХрдЯ рдХреЗ рддрд╣рдд, рдПрдХ рдЫреЛрдЯрд╛ рд╕реНрдХреЗрдЪ рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рдпрд╛ рдмрдбрд╝реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд▓рдЧрднрдЧ рдкрд░реНрдпрд╛рдкреНрдд рджрд┐рдЦрддрд╛ рд╣реИред

#include <stdio.h> #define REPEAT(...) #__VA_ARGS__;__VA_ARGS__ char * ref = REPEAT( int main() { printf("#include <stdio.h>\n" "#define REPEAT(...) #__VA_ARGS__;__VA_ARGS__\n" "char * ref = REPEAT(%s)", ref); return 0; } ) 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрд░реЛрдд рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╣реЗрдбрд░ рд╕реЗ рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ REPEAT рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╝рд┐рдкрд┐рдд рдФрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
REPEAT рдореИрдХреНрд░реЛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрддреА рд╣реИ (рддрд╛рдХрд┐ рд╡реЗ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ), рдлрд┐рд░ "рд╕реНрдЯреНрд░рд┐рдВрдЧ" рдЗрд╕реЗ рдХреНрдпрд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдпрд╣ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдЙрджреНрдзрд░рдг рдХреЗ рдмрд┐рдирд╛ (рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП)ред
рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 g++ -E main.cpp 

 char * ref = "int main()" "{" " printf(\"#include <stdio.h>\\n\"" " \"#define REPEAT(...) #__VA_ARGS__;__VA_ARGS__\\n\"" " \"char * ref = REPEAT(%s)\", ref);" " return 0;" "}"; int main() { printf("#include <stdio.h>\n" "#define REPEAT(...) #__VA_ARGS__;__VA_ARGS__\n" "char * ref = REPEAT(%s)", ref); return 0; } 

рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкрдардиреАрдп рдмрдирд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рд╕реНрдХреИрд▓реНрдк рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рд╣рд╛рдЗрдлрд╝рдиреЗрд╢рди рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджреНрдзрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╛рди рд╕реНрд░реЛрдд рдХреЛ stdout рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рдЭреБрд░реНрд░реАрджрд╛рд░ рд╣реИред

PS #include рдХреЛ REPEAT рдмреНрд▓реЙрдХ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


Source: https://habr.com/ru/post/In126075/


All Articles