如果c不支持运算符重载,我们如何在#include指令中使用小于号('<'或甚至大于('>'))?

时间:2016-07-28 10:29:22

标签: c operator-overloading c-preprocessor

我们都知道c不支持运算符重载。任何人都告诉我,如果是这样,那么我们如何能够使用 #include 指令中的少于符号并在比较也?或者提供的功能被称为其他功能并用语言定义?

3 个答案:

答案 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;”但这是不同语法的一部分