私はプログラミングをより良くするためにcoreutilsソースコードを研究しています、そして私はこれらの行をbase64.cと他のもので見つけました:
while ((opt = getopt_long (argc, argv, "diw:", long_options, NULL)) != -1)
switch (opt)
{
// ... other stuff
case_GETOPT_HELP_CHAR; // <- this especially
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
// .. other stuff again
system.hでこれを見つけるまで、これが一体何を意味するのかわかりませんでした。
#define case_GETOPT_HELP_CHAR \
case GETOPT_HELP_CHAR: \
usage (EXIT_SUCCESS); \
break;
こんなにたくさんの文で構成されたマクロを実際に作れるとは知りませんでした!マクロで非常に多くのステートメントを使用するのは危険ではありませんか、それともこれは私が学ぶべき良いコーディングスタイルですか?
編集:また、coreutilsで実際に使用されているマクロがたくさんあることに気づきました。私はC++のバックグラウンドを持っているので、少し混乱します。
#define STREQ(a, b) (strcmp (a, b) == 0)
たとえば、上記のこれは本当に必要ですか?これにより、コードの読み取りが難しくなり、infステートメントでSTREQUを実行するだけではあまり節約されません。
EDIT2:一方、ジェイのおかげで、私はこれがとても好きです:
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};