5

我希望能够使用诸如writefln()但不必import std.stdio在文件顶部添加的功能。

另一种解释它的方式是你在 C++ 中的方式。您可以键入std::cout << "Test";,这将阻止您添加using namespace std;. 我想做同样的事情,但在 D 中。

4

5 回答 5

8

我知道这是一个老问题,但我没有看到正确的答案,所以我还是要回答。

静态导入

基本导入适用于模块和导入相对较少的程序。如果有大量导入,则在各个导入模块中的名称之间可能会开始发生名称冲突。阻止这种情况的一种方法是使用静态导入。静态导入需要使用完全限定名称来引用模块的名称:

static import std.stdio;

void main()
{
    writefln("hello!");            // error, writefln is undefined
    std.stdio.writefln("hello!");  // ok, writefln is fully qualified
}

资源

于 2009-02-27T00:16:44.047 回答
6

如上所述,D 模块不仅仅是 C++ 命名空间。D 也是一种模块化语言。D 中的模块具有构造函数/析构函数。此外,D 有包。在此处阅读有关 D 中的模块和包的更多信息:http ://www.digitalmars.com/d/2.0/module.html 。

这是该页面内容中最有趣的部分:

模块与源文件一一对应。模块名是去掉了路径和扩展名的文件名。

模块自动为其内容提供命名空间范围。模块表面上类似于类,但不同之处在于:

  • 每个模块只有一个实例,并且是静态分配的。
  • 没有虚拟表。
  • 模块不继承,它们没有超级模块等。
  • 每个文件只有一个模块。
  • 可以导入模块符号。
  • 模块总是在全局范围内编译,不受周围属性或其他修饰符的影响。

模块可以在称为包的层次结构中组合在一起。

模块提供了几个保证: - 导入模块的顺序不影响语义。- 模块的语义不受导入它的影响。- 如果模块 C 导入模块 A 和 B,对 B 的任何修改都不会默默地更改 C 中依赖于 A 的代码。

于 2008-11-11T23:55:05.567 回答
5

您必须使用导入部分。但是,可以使用前面的完整模块路径来处理方法/功能/任何内容。例如,如果您导入 std.stdio(并使用 Phobos),则 std.stdio.writefln("...") 将是有效的。如果您有多个称为“writefln”的函数,这将很有用。

于 2008-10-19T10:34:13.797 回答
2

我不认为你能做到这一点。D 中的语句importusing namespaceC++ 中的语句做得更多。它还替换了#include预处理器指令。

于 2008-10-18T13:59:10.343 回答
0

您可以导入单独的函数/类(不确定语法):

import std.stdio: writef, writefln;
于 2010-08-20T02:22:30.190 回答