我希望能够使用writefln()
之类的功能,但无需在文件顶部添加import std.stdio
。
解释它的另一种方法是你在C ++中的方式。您可以输入std::cout << "Test";
,这将阻止您添加using namespace std;
。我想做同样的事情,但在D。
答案 0 :(得分:8)
我知道这是一个老问题,但我看不出正确的答案,所以无论如何我都在回答。
静态进口
基本导入适用于程序 相对较少的模块和 进口。如果有很多 导入,名称冲突可以开始 发生在。中的名字之间 各种进口模块。一种方法 停止这是通过使用静态导入。 静态导入需要使用一个 完全限定名称以引用 模块的名称:
static import std.stdio; void main() { writefln("hello!"); // error, writefln is undefined std.stdio.writefln("hello!"); // ok, writefln is fully qualified }
答案 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;