#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; }
正直に言うと、プリプロセッサはほとんどすべてを1行で作成するため、コードを変更して読みやすくしました。 それにもかかわらず、ハイフネーションと余分な引用符を除いて、すべてが整っています。
開始後、機能的に同一のソースが標準出力に表示されます。 デザインはほんの少ししわです。
PS #includeをREPEATブロックに入力すると、行に明示的に書き込むことを省略できます。