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

Swift语言中的“ @_silgen_name”是什么?

阮健
2023-03-14
问题内容

在Swift 2.2中阅读Darwin库时,我发现了以下代码。

@warn_unused_result
@_silgen_name("_swift_Darwin_sem_open2")
internal func _swift_Darwin_sem_open2(
  name: UnsafePointer<CChar>,
  _ oflag: CInt
) -> UnsafeMutablePointer<sem_t>

第二行中的“ @_silgen_name”是什么?

我从这里找到了以下信息,但是我想要更多详细信息,例如Apple Developer Library。

如果只是要从C调用的一组特定的Swift函数,则可以使用@_silgen_name属性覆盖改写的名称,和/或使它们成为@convention(c)以使用C调用约定。


问题答案:

@_silgen_name最近才使用以下提交消息从@asmname(请参见以下提交)重命名:

这反映了以下事实:该属性 仅供编译器内部使用 ,并且实际上并不等效于C的asm属性,因为它不会将调用约定更改为与C兼容。

因此,作为一名普通的Swift开发人员,除非有将Swift移植到其他平台的经验,否则就不会遇到这个属性。

现在,@_silgen_nameSILGenNameAttr具有某些选项的类的属性(宏),其中后者是Swifts
抽象语法树(AST)的一部分。从swift/AST/Attr.def源代码(另请参见swift
/ lib / AST /
Attr.cpp


// Schema for DECL_ATTR:
//
// - Attribute name.
// - Class name without the 'Attr' suffix (ignored for
// - Options for the attribute, including:
//    * the declarations the attribute can appear on
//    * whether duplicates are allowed
//    * whether the attribute is considered a decl modifier or not (no '@')
// - Unique attribute identifier used for serialization.  This
//   can never be changed.
//
// SIMPLE_DECL_ATTR is the same, but the class becomes
// SimpleDeclAttr<DAK_##NAME>.
//

DECL_ATTR(_silgen_name, SILGenName,
          OnFunc | OnConstructor | OnDestructor | LongAttribute |
          UserInaccessible, 0)

我们SILGeneNameAttr在swift / AST /
Attr.h中找到的声明:

/// Defines the @_silgen_name attribute.
class SILGenNameAttr : public DeclAttribute {
public:
  SILGenNameAttr(StringRef Name, SourceLoc AtLoc, SourceRange Range, bool Implicit)
    : DeclAttribute(DAK_SILGenName, AtLoc, Range, Implicit),
      Name(Name) {}

  SILGenNameAttr(StringRef Name, bool Implicit)
    : SILGenNameAttr(Name, SourceLoc(), SourceRange(), /*Implicit=*/true) {}

  /// The symbol name.
  const StringRef Name;

  static bool classof(const DeclAttribute *DA) {
    return DA->getKind() == DAK_SILGenName;
  }
};

总结一下;
它与为C函数提供Swift接口有关。您很可能很难SILGenNameAttr在开发人员库中找到有关的任何详细信息,并且可以将其视为未记录的功能。

最后,您可能会感兴趣与Russ Bishop进行以下对话:

  • 不安全的Swift:为了娱乐和获利。

工具箱:这里有龙(34:20)

在任何情况下,我都不会在生产应用程序中交付此产品。但是,如果您喜欢冒险,那就来吧。

@asmname是装饰函数的属性。您绝对需要了解ABI才能使用此工具。Swift不会非常帮助您整理参数。编译器不会太宽容,因此必须确保已将参数操纵为兼容的格式。以下代码显示了如何声明它。给出函数属性,@asmname和字符串符号;然后将其参数用作返回类型。如果您输入的参数错误或返回类型错误,编译器将不会抱怨。它仅期望该符号存在,并且当它跳转到它时,最好采用这些参数并具有该返回类型。

@asmname("dispatch_get_current_queue") func _get_current_queue() ->

dispatch_queue_t

问答(37:08)

显然,并非所有记录都由Apple记录,那么发现所有这些行为的过程如何?

拉斯 :我先看一下文档,但是您说对了,那里没有很多东西。如果您转到Swift REPL并使用该标志(我想这是类似的东西
-deprecated-integrated- repl),则可以要求它打印Swift模块以及Xcode不会向您显示的所有位。如果深入工具链目录Xcode,您还可以在libswiftCore和libswiftRuntime中找到东西。

JP :如果您有兴趣使用Swift做更多不安全的事情,可以在GitHub中搜索代码@asmname语言
Swift”,您会看到很多非常糟糕但有趣的东西。

Bishops博客的一篇稍旧的文章:

  • 斯威夫特-不要这样做。

首先,请注意@asmname属性。这等于
DllImportextern。它告诉Swift,我们将链接到一些库,该库定义具有给定名称并匹配给定参数的函数。
“请相信我Swift,我知道我在做什么” 。提示:您最好知道自己在做什么。



 类似资料:
  • 问题内容: 我对&符号的了解只是一点点的了解,但有时我会在变量名的前面看到它。将a 放在变量前面有什么作用? 问题答案: 用作使变量成为输入输出参数。实际上,输入输出表示通过参考传递值,而不是通过值传递值。而且,它不仅需要通过引用接受值,还需要通过引用传递值,所以用&传递值,而不是 如您所见,您可以在Swift的错误处理中使用它,您必须创建一个错误引用并将其传递给使用该函数的函数,如果发生错误,该

  • 问题内容: 我在github上找到了一些用Swift编写的代码, 并对这条线有些困惑 您能解释一下这条线的真正含义吗?非常感谢你! 问题答案: 意思是不要给那东西起名字。它可以在许多地方使用。就您而言,这就是说忽略传递给闭包的变量。您提供的代码将忽略所有参数,但您也可以忽略某些参数。 是执行关闭的开始。在您的示例代码中,闭包的实现为空。 总体而言,该行定义了一个名为“ done”的闭包,该闭包接受

  • 问题内容: Swift编程语言指南包含以下示例: 然后,在将公寓分配给该人时,他们使用感叹号“解开实例”: “取消实例包装”是什么意思?为什么有必要?它与仅执行以下操作有何不同: 我是Swift语言的新手。只是想降低基础知识。 更新: 我遗漏的一大难题(未在答案中直接说明-至少在撰写本文时没有)是在执行以下操作时: 正如我最初所认为的,这并不意味着“ 是类型,可能为零”。我只是误解了,它们是完全独

  • 问题内容: 我只是想知道Swift是像php一样的动态还是静态的,我的意思是我可以在应用程序运行时生成类吗? 问题答案: 它是静态的-非常静态。编译器必须有关于所有类和功能的全部信息 在编译时 。您可以(使用)“扩展”现有的类,但是即使那样,您也必须在编译时完全定义该扩展所包含的内容。 Objective-C是动态的,并且在现实生活中,由于您可能会在Cocoa的存在下使用Swift,因此可以使用O

  • 主要内容:文件流我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据; 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数

  • 中文版 Apple 官方 Swift 教程《The Swift Programming Language》 目录: 欢迎使用 Swift 关于 Swift(完成 By numbbbbb) Swift 初见(完成 By numbbbbb) Swift 教程 基础部分(完成 By numbbbbb, lyuka, JaySurplus) 基本操作符(完成 By @xielingwang) 字符串和字符