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

时间:2008-10-18 13:50:36

标签: d

我希望能够使用writefln()之类的功能,但无需在文件顶部添加import std.stdio

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

5 个答案:

答案 0 :(得分:8)

我知道这是一个老问题,但我看不出正确的答案,所以无论如何我都在回答。

  

静态进口

     

基本导入适用于程序   相对较少的模块和   进口。如果有很多   导入,名称冲突可以开始   发生在。中的名字之间   各种进口模块。一种方法   停止这是通过使用静态导入。   静态导入需要使用一个   完全限定名称以引用   模块的名称:

     
static import std.stdio;

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

Source

答案 1 :(得分:6)

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

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

  

模块具有一对一的功能   与源文件的对应关系。该   模块名称是带有的文件名   路径和延伸被剥夺了。

     

模块自动提供   内容的命名空间范围。   模块表面上看起来很像   课程,但不同之处在于:

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

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

     

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

我认为你不能那样做。 D中的import语句比using namespace语句在C ++中的作用更多。它还取代了#include预处理程序指令。

答案 4 :(得分:0)

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

import std.stdio: writef, writefln;