我们都知道c不支持运算符重载。任何人都告诉我,如果是这样,那么我们如何能够使用 #include 指令中的少于符号并在比较也?或者提供的功能被称为其他功能并用语言定义?
答案 0 :(得分:5)
根据具体情况,C中的许多符号具有不同的含义。
示例:
*
可以表示乘法或指针取消引用。
这样的双重含义使得编写C语法分析器变得有点棘手,甚至在代码无法编译时更难以提供有用的错误消息。
请注意,这种双重含义是不运算符重载。他们是两个独立的运营商。
对于#include
指令,答案是它们由预处理器处理。在预处理器步骤之后<
和>
消失了 - 该行已被包含文件的全部内容替换。
答案 1 :(得分:3)
虽然通常我们只是调用像gcc file.c
这样的东西来编译我们的源文件,虽然我们说我们'编译',但是发生了很多各种各样的事情。
源文件发生的第一件事就是预处理。当你把它写下来时,源被送入预处理器。预处理器只关心#
- 已启动的行,包括...... #include <header.h>
一旦预处理器完成了它的工作,所有<header.h>
都被header.h
的实际内容所取代,这样你的源文件现在才准备好由编译器实际编译。试试gcc -E file.c
看看会发生什么。
现在C编译器介入。它看到的任何<
或>
都只是比较运算符。
再一次:#include <header.h>
指令用于预处理器,其余用于编译器。后者在前者之后工作。
答案 2 :(得分:1)
最常见的例子是C预处理器,它以“#”开头的行作为指令。 因为它对基础语言一无所知 ...(wiki)
预处理器不知道“&lt;”小于”。它就像Jon Snow一样,什么都不知道,所以这不是运算符重载,它只是遵循其他词法规则
this显示了ANSI-C语法的词法规范。请注意,有一些规则,如
"=" { count(); return('='); }
并且喜欢
"==" { count(); return(EQ_OP); }
词法分析器知道返回最适合它看到的内容。它知道,当看到x==y
并不意味着x=
和=
以及y
没有任何意义时......对于“&lt;”和“#include&lt;”但这是不同语法的一部分