在这种情况下,#define 的作用是什么?
What is the Action of #define in this Instance?
作为我家庭作业的一部分,我得到了这段代码来帮助完成他们交给我们的任务......创建支持管道、后台进程和许多内置命令等的基本 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
(。
- "using namespace std;"在C++的作用是什么?
- 此代码中的" "是什么,它的基本作用是什么?
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- <<、>>算子在循环中的作用是什么
- 在c++中,减号和加号对字符串的作用是什么
- 窄集(_cast)的作用是什么
- 在这种情况下,#define 的作用是什么?
- 遍历模板参数包,没有争论的专业化的作用是什么?
- 在 c++ 中,没有 **std::fixed** 的 **std::setprecision()** 的作用是什么?
- 访问多个阵列时 CPU 缓存的作用是什么?
- 以下表达式的作用是什么:x = (a1,a2,..,n);
- 私人成员的作用是什么?
- 这段代码的作用是什么?
- *.exp文件的作用是什么
- ifstream::open()真正的作用是什么
- 如何在矩阵中使用指针.这行代码的作用是什么:int r=**(++b);
- 这个函数的作用是什么?与夹紧值有关
- 这个运算符()语法的作用是什么
- std::函数的模板参数中“const”修饰符和引用的作用是什么
- 字符串流在C++编程中的作用是什么