在这种情况下,#define 的作用是什么?

What is the Action of #define in this Instance?

本文关键字:作用 是什么 #define 这种情况下      更新时间:2023-10-16

作为我家庭作业的一部分,我得到了这段代码来帮助完成他们交给我们的任务......创建支持管道、后台进程和许多内置命令等的基本 shell。我已经通读了他们提供给我们的用于解析的代码......

我熟悉 C 中的#define关键字,但是,我没有看到它在下面的代码中使用:即,c有什么用?我猜它已被指定为表示一个角色,但我不确定:

#define PIPE  ('|')
#define BG    ('&')
#define RIN   ('<')
#define RUT   ('>')
#define ispipe(c) ((c) == PIPE)
#define isbg(c)   ((c) == BG)
#define isrin(c)  ((c) == RIN)
#define isrut(c)  ((c) == RUT)
#define isspec(c) (ispipe(c) || isbg(c) || isrin(c) || isrut(c))

任何帮助或建议非常感谢。

您给出的最后五个#define语句定义了宏,每个都接受一个参数,这里总是称为c。从技术上讲,您的前四个#define语句也是宏,但它们不需要参数 - 它们在遇到时只是用它们的"值"代替;通常,程序员将没有参数的宏称为标记,此处的PIPE令牌的令牌值为('|')

稍后在文件中(可能(会出现调用一个或多个宏的情况,并且该调用将具有实际参数的值,例如:

if (ispipe(test_arg)) ++npipes;

此宏"调用"将被以下扩展替换(由预处理器(:

if (((test) == ('|')) ++npipes;

同样,对于其他 #define XXX(c( 宏。

注意:在宏定义中添加(大量(括号是很常见的,只是为了确保代码在预处理器完成其工作后按照您"的想法"执行

。请随时要求进一步的解释和/或澄清。

#define

不是一个函数,它是一个预处理器指令

c可以是任何东西。如果写ispipe(42),那么预处理器会把它改成((42) == PIPE)。如果你写ispipe(while(1);),那么预处理器会把它改成((while(1);) == PIPE),这会让编译器在读取它时目瞪口呆。

预处理器是盲目的,对C语法知之甚少,对它的语义一无所知;理解c应该是什么的唯一方法是对预期的用法进行逆向工程,或者询问编写代码的人没有注释,告诉你他们的意思。

编辑后,相当合理地期望c应该是一个char,以便有意义地与'|'和类似进行比较。但即使传递0xDEADBEEF也应该正确编译(返回FALSE(。