当前位置: 首页 > 面试题库 >

函数名称和原型中的斜线和圆点?

爱海
2023-03-14
问题内容

我是C语言的新手,看着Go的源代码树,我发现了这一点:

https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c

void runtime∕race·Read(int32 goid, void *addr, void *pc);
void runtime∕race·Write(int32 goid, void *addr, void *pc);

void
runtime·raceinit(void)
{
    // ...
}

斜杠和点(·)是什么意思?这是有效的C吗?


问题答案:

重要更新:

最终的答案* 肯定是您 *在golang-nuts邮件列表中


Go的作者之一 Russ Cox 获得的。就是说,我将在下面留下我的一些早期笔记,它们可能有助于您理解某些内容。

另外,通过阅读上面链接的答案,我相信在比我在下面测试过的版本更高的Go
C编译器中,“伪斜杠”现在也可以转换为常规/斜杠(例如将中点转换为点)。但我没有时间去验证。

该文件由Go语言套件的内部C编译器进行编译,该内部C编译器起源于Plan
9 C编译器(1)(2),并且与C标准有一些区别(主要是扩展名AFAIK)。

扩展之一是,它允许标识符中使用UTF-8字符。

现在,在Go Language Suite的C编译器中,对中点字符(·)进行了特殊处理,因为它被转换为目标文件中的常规点(。),由Go Language
Suite的内部链接器解释为名称空间分隔符字符。

对于以下文件example.c(注意:它必须另存为UTF-8,不带BOM):

·Bar1(){}
无效foo·bar2(){}
无效foo ∕ baz·bar3(){}

内部C编译器产生以下符号:

$ go工具8c example.c
$ go工具nm example.8
 T“” .Bar1
 T foo.bar2
 T foo ∕ baz.bar3

现在,请注意,我给了·Bar1()一个大写字母B。这是因为这样,我可以使它对常规的Go代码可见-
因为它被转换为与编译以下Go代码所产生的符号完全相同的符号:

包装实例
func Bar1(){} // nm将显示:T“” .Bar1

现在,关于您在问题中命名的功能,故事将进一步深入到兔子洞中。我不太确定自己是否会在这里,但我会根据我所知道的情况进行解释。因此,此点以下的每个句子都应读为好像在结尾处写有“
AFAIK ”。

因此,需要更好地理解这个难题的下一个缺失部分是,进一步了解奇怪的""名称空间以及Go套件的链接程序如何处理它。该""命名空间是我们可能要调用一个“空”(因为""一个程序员机构“的一个空字符串”)命名空间,或者也许更好,一个“占位符”命名空间。当链接器看到这样的导入时:

import examp "path/to/package/example"
//...
func main() {
    examp.Bar1()
}

那么它将获取$GOPATH/pkg/.../example.a库文件,并在导入阶段即时""用替换每个文件path/to/package/example。因此,现在,在链接程序中,我们将看到如下符号:

 T路径/到/包装/示例.Bar1


 类似资料:
  • 我不太清楚kotlin是如何管理属性名和主构造函数参数名的。如果我写了相同的属性名和参数名,那么kotlin编译器会给出一个错误。 它给出了这个错误。 但是,当我更改属性的名称或更改主构造函数的参数名称时,代码将工作并编译。 这将工作或编译罚款。 这背后的原因是什么?为什么主构造函数的参数名和属性名不能相同?

  • 本文向大家介绍详解opencv中画圆circle函数和椭圆ellipse函数,包括了详解opencv中画圆circle函数和椭圆ellipse函数的使用技巧和注意事项,需要的朋友参考一下 1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, doubl

  • 问题内容: 如何获得调用当前函数的函数的名称和行?我想要一个像这样的基本调试功能(使用npmlog定义): 当从另一个函数调用时,它将是这样的: 为了清楚起见,我想要的基本上与[ython中的类似: 是否有等效的Node来完成此任务? 问题答案: 您可以添加一些原型以提供从V8访问此信息的权限: 分别返回“ 28”和“ foo”。

  • 我需要在使用EasyNetQ的微服务和使用Spring AMQP的之间发送消息。 问题在于properties消息,Spring Boot Amqp中的类型位于propertyheaders容器中,而在EasynetQ中,则来自名为的其他属性。 谁能告诉我,我需要定制什么,让Comunication他们以及?

  • 问题内容: 我的问题是为什么我不能再次调用该函数?或者,如何做到这一点? 假设我有这个功能: 我称之为: 我得到4。 但是,假设我声明了一个与该函数同名的变量(错误): 现在,如果我尝试这样做: 要么: 我将收到此错误:“ TypeError:’int’对象不可调用” 无法将变量“ a”分配给函数? 问题答案: 完成此操作后: 不再是一个 函数 ,而只是一个 整数 (您已将其重新分配!)。因此,很

  • 问题内容: 如果我有 我如何在内部找出现在由表示的变量称为? 问题答案: 这是不可能的。即使是按引用传递也不会帮助您。您必须将名称作为第二个参数传递。 但是,您肯定要问的 不是 解决问题的好方法。