我正在研究 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 中实际上使用了很多 MACROS。这让我有点困惑,因为我来自 C++ 背景。
#define STREQ(a, b) (strcmp (a, b) == 0)
比如上面这个,真的有必要吗?它使阅读代码变得更加困难,并且仅在 inf 语句中执行 STREQ 并没有节省多少
EDIT2:另一方面,我非常喜欢这个,感谢杰伊:
#define COMMAND(NAME) { #NAME, NAME ## _command }
struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};