如何在D中使用函数的完整命名空间路径

5 d

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

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

zil*_*n01 8

我知道这是一个老问题,但我没有看到正确的答案,所以无论如何我都在回答.

静态进口

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

static import std.stdio;

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

资源


小智 6

如上所述,D模块远不止C++命名空间.D也是MODULAR语言.D中的模块具有构造函数/析构函数.而且,D有包裹.在此处阅读有关D中模块和软件包的更多信息:http://www.digitalmars.com/d/2.0/module.html.

这是该页面所说的最有趣的部分:

模块与源文件一一对应.模块名称是文件名,其路径和扩展名被剥离.

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

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

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

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


Mau*_*den 5

您必须使用导入部分.但是,可以使用前面的完整模块路径来解决方法/功能/任何问题.例如,如果导入std.stdio(并使用Phobos),则std.stdio.writefln("...")将有效.如果您有多个名为"writefln"的函数,这将非常有用.


Fer*_*cio 2

我认为你做不到。D 中的语句import比 C++ 中的语句执行的功能更多using namespace。它还取代了#include预处理器指令。