C 在哪里可以找到->;的源代码;解引用运算符?

C 在哪里可以找到->;的源代码;解引用运算符?,c,struct,dereference,C,Struct,Dereference,我现在在Ubuntu上,我希望有人能在我想要的文件中告诉我c struct dereference操作符->在..当我 grep -R -> . 我明白了 bash: .: Is a directory 当我省略“.”时,我得到 bash: syntax error near unexpected token `newline' 我想用另一种语言重现这个功能,但谷歌什么都没有。非常感谢任何帮助。操作符不是库类或函数,它没有“定义”(除非我们谈论的是重载操作符) 编译器解析符号并

我现在在Ubuntu上,我希望有人能在我想要的文件中告诉我c struct dereference操作符->在..当我

grep -R -> . 
我明白了

 bash: .: Is a directory
当我省略“.”时,我得到

bash: syntax error near unexpected token `newline' 

我想用另一种语言重现这个功能,但谷歌什么都没有。非常感谢任何帮助。

操作符不是库类或函数,它没有“定义”(除非我们谈论的是重载操作符)


编译器解析符号并创建适当的代码,但这并不是通过用某种方法替换“->”。

您的grep编写不正确:

grep -R -> . 
它在干什么?大概是这样的:

grep -R - > . 
现在这可能更清楚一点:它将查看“-”(可能是stdin,对于grep我不确定,但许多工具都使用-stdin)。它将把结果写入“.”,除了它是一个目录(特别是当前目录)。所以它失败了

如果要搜索->运算符,可以使用以下命令:

grep -R -- "->" . 
“--”是一个相当标准的Unix东西,意思是“在此之后停止处理选项”,将“->”放在引号中应该可以阻止shell将其解释为两个令牌(stdin加上重定向)


无论如何,这些都不重要,因为您永远也找不到操作符->的源代码。它是在语言中定义的,实现它的源代码完全在编译器中。因此,如果您真的需要,请下载编译器的源代码并在那里使用grep…即使这样,通过使用“->”进行grep也可能无法很快找到它。

grep中的
-
正在指定一个新的命令选项。所以,你需要逃避它。有一个方便的
grep
语法
grep--“->”
将搜索
->


但是,我怀疑您是否会发现任何东西,因为运算符不是方法。

bash报告了该错误消息,因为在
grep-R->。
中,
看起来像是标准输出的重定向,因此bash尝试将
作为文件打开,并将输出写入其中。这会失败,因为
代表当前目录,并且目录不能以与文件相同的方式打开

通过使用引号,例如
grep-R“->”
,可以避免bash以这种方式解释
。但是,grep将
-
解释为指示命令行选项,而不是要搜索的模式。可以通过使用反斜杠标记
-
来避免这种情况:

grep -R "\->" .
或者使用
--
告诉grep选项的结束位置:

grep -R -- "->" .
不幸的是,这将只找到包含字符串“->”的文件;它不会区分实现C
->
运算符的文件。将有许多文件包含与您正在搜索的内容无关的字符串

我希望C
->
操作符将实现如下内容:

grep -R - > . 
  • 词法分析中涉及的某些文件中的某些代码将识别字符串“->”,并通过生成一个标记来响应,该标记可能具有任意名称(由该特定代码的作者选择,不受任何特定标准或规范的约束),例如解引用
  • 语法分析中涉及的某些文件中的某些代码将通过发出执行取消引用操作的代码(可能是编译器自己使用的中间语言)来处理取消引用标记。或者,代码可以将
    a->b
    等表达式转换为
    (*a).b
    ,然后为后者发出代码
发出此代码的过程和代码本身都不一定是单个操作。它可能涉及检查左操作数的类型、计算右操作数的偏移量、将表达式与其上下文中的内容关联(以支持优化)以及生成实际的中间代码。该中间代码可由优化或编译器的其他部分进一步处理,并将在以后用于生成最终机器代码


总之,没有一个地方可以实现
->
。它是一个复杂过程的一部分,与编译器的其他部分交互。

为什么您认为任何C运算符都是在语言规范之外的任何地方定义的。->和。是C语言的一部分。这就像问*or=操作符住在哪里。你的grep问题很简单,至少:
grep-R-e'->。
谢谢你的回答,也谢谢所有回答的人……关于我将如何用C编写一个类似->操作符功能的函数的任何线索……我正在为C编写胶水代码,以便用另一种语言包装,但我还没有弄清楚它的编程方法“那…我想用另一种语言获取c功能。@Edwardmoney:要实现
->
,请获取结构的基址,添加成员的偏移量,将总和用作指向成员类型的指针,然后获取该地址的值。”。