WinAPI 库有命名空间吗?

Posted

技术标签:

【中文标题】WinAPI 库有命名空间吗?【英文标题】:Do WinAPI libraries have namespaces? 【发布时间】:2018-07-28 00:35:21 【问题描述】:

作为一名 C# 程序员,我已经熟悉 .Net Framework 库中的using 命名空间协议。

我想知道,自从WinAPI is implemented in C++,unmanaged 编程语言with namespaces 以来,如果像 User32Kernel32 这样的 WinAPI 库也有命名空间?

编辑:我完全知道C 不包含命名空间。 我问我的问题的印象是WinAPI 库和它被设计用来与之交互的 C 编程语言之间存在一些抽象。

【问题讨论】:

没有。这些不是托管程序集。 Win32 API 是为 C 和 C 兼容语言设计的。 C 没有命名空间。 我正试图摆脱问题禁令。按照建议,这些修改是我的英勇努力。 @IInspectable 他们的编辑真的改变了问题的含义吗?我对 WinAPI 完全没有经验,但似乎 joseph 只是在这里澄清/提供了他们问题的背景。此外,这正在meta 上进行讨论。 @Rob:将问题从 “Windows API 是否有命名空间” 更改为 “我知道它不能有命名空间,但让我问另一个问题" 大大改变了这个问题。我也不清楚这个新问题。此外,他们从错误的前提开始,即 .NET 中有命名空间。没有。这只是 C# 之类的编程语言创建的幻觉。 【参考方案1】:

Windows API 严格作为 C 接口公开。 C 中没有命名空间。如果您需要访问 API,您必须:

包括声明函数的适当头文件。 链接到实现它的导入库。

文档告诉您要包​​含哪个标头以及要链接到哪个库(如果有的话)。


更新(问题更改后):

从您的a comment 看来,您要问的是,某些 Windows API 实现是否在内部使用命名空间。嗯,我不知道,我不在乎。你也没有。无论答案如何,您都无法处理这些信息。

让我们暂时假设 kernel32.dll 是用 C++ 实现的,并且使用命名空间。为了维持一个 C 接口,任何命名空间信息都不能出现在 API 表面。这使得命名空间仅供内部使用。如果在内部使用它们,一旦链接器解析了符号,所有命名空间的痕迹都会丢失。 (这些符号可能出现在私有调试符号,甚至公共调试符号中,以及用于 RTTI 的字符串文字中。除了查看它们之外,这些都不允许您做任何有意义的事情。)

【讨论】:

这就是您在使用 C 和 C++ 编程时需要做的事情。对于其他语言,情况有所不同。这里的提问者是用C#编码的,不能包含头文件和导入库的链接。 @DavidHeffernan:OP 解释说,他们熟悉在 C# 中引用库。不过,该问题并未明确询问如何从 C# 访问 Windows API。 c# 标签可能不相关(就像 user32 标签一样)。【参考方案2】:

WinAPI 库尽管有 C 和 C++ 实现,但没有命名空间,因为它们被设计为与 C 接口 - 一种不支持命名空间的语言。

【讨论】:

这是不正确的。那些用 C++ 编写的 Windows API 库很可能有命名空间。它们仅在内部使用,从不出现在 API 表面。 API 也不是为与 C 交互而设计的。该 API 旨在与 任何 语言进行交互,这些语言可以使用 C 接口,例如C、C++、Delphi、Java等 @IInspectable 这是我一直在寻找的答案。我确实在某处读到所有与 C 兼容的语言都可以与 WinAPI 接口,但未能推断出它专门是一个 C 接口,而不管它的 C++ 实现。 我仍然不确定,为什么您this 对命名空间如此着迷。它们不是 C++ 最有价值的特性,主要用于消除符号的歧义。 C++ 中很少使用命名空间来划分代码。另请注意,.NET 中也没有任何命名空间。 CLR 不知道命名空间,程序集元数据也没有任何规定来定义命名空间。这并不妨碍语言(如 C#)提供命名空间支持,映射到 .NET 公开的平面接口。 @IInspectable 作为 C# 程序员,“使用”后跟命名空间是我导入数据的主要方式(其他是 DllImport 属性)。除非 Visual Studio 2017 中的对象浏览器对我说谎,否则 .NET 框架库确实具有命名空间。 CorTokenType 列出了可以在 .NET 元数据中使用的所有可能的令牌。没有用于编码命名空间的令牌。对于 C# 开发人员来说,命名空间看起来只是 . 分隔的公共类型前缀(例如 System.Data)。原始类型名称包括该前缀(例如System.Data.DataSet)。对象浏览器将原始元数据转换为开发人员熟悉的表示形式(即 C# 中的命名空间)。它只是在保持幻想。

以上是关于WinAPI 库有命名空间吗?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“System.Configuration”中不存在类型或命名空间名称“ConfigurationManager”

C#中jobject 命名空间的啥

jQuery 事件命名空间可以包含破折号吗?

static关键字在命名空间范围内没用吗?

JQuery 命名空间是一个好习惯吗?

schematron:我可以对命名空间进行分组吗