考虑有moda.d
:
module moda;
private struct modb {};
并且modb.d
:
module modb;
private import moda;
并且modmain.d
:
module modmain;
static import moda;
static import modb;
void main() {
modb v; // should NOT compile, should it?
}
我不知道为什么,但是在andmoda.modb
中都是可见的,而据我所知,它不应该 - 由于被导入为和being 。还是应该?我遇到了 dmd 错误还是我不理解的计划行为?modmain
modb
moda
static
moda.modb
private
Update1:我进行了一些测试,以确定在哪些情况下错误会复制。
第一列是 for import moda
,第二列是 for import modb
,第三列是用作结构名称的标识符。所有的测试都应该编译失败,但有些可以编译。
图注:D - “导入模块;”,S - “静态导入模块;”,N - 不导入。
D;D;foobar - 由于错误 #2830 而编译
S;D;foobar - 按预期失败
N;D;foobar - 按预期失败
D;S;foobar - 由于错误 #2830 而编译
S;S;foobar - 按预期失败
N;S;foobar - 按预期失败
D;N;foobar - 由于错误 #2830 而编译
S;N;foobar - 按预期失败
N;N;foobar - 按预期失败
D;D;moda - 由于错误 #2830 而编译
S;D;moda - 不应该编译
N;D;moda - 不应该编译
D;S;moda - 由于错误 #2830 而编译
S;S;moda - 不应该编译
N;S;moda - 按预期失败
D;N;moda - 由于错误 #2830 而编译
S;N;moda - 不应该编译
N;N;moda - 按预期失败
D;D;modb - 由于错误 #2830 而编译
S;D;modb - 不应该编译
N;D;modb - 不应该编译
D;S;modb - 由于错误 #2830 而编译
S;S;modb - 不应该编译
N;S;modb - 不应该编译
D;N;modb - 由于错误 #2830 而编译
S;N;modb - 按预期失败
N;N;modb - 按预期失败
似乎如果某个模块的名称与非公开符号相同,则无论保护级别如何,它都会被公开。