小規模または大規模な内省的なC / C ++プログラム

Habrakatでは、小さなスケッチを使用すると、独自のコードを含み、ほぼ適切に見える小規模または大規模なアプリケーションを作成できます。



#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ブロックに入力すると、行に明示的に書き込むことを省略できます。



All Articles