如何理解在betterC模式下可以使用哪些函数?
How to understand which functions can be used in betterC mode?
我正在尝试在 betterC
模式下编译下一个代码:
import core.stdc.stdio;
import std.algorithm;
extern(C):
int main()
{
int [] x = [1,2,3,4,5];
if(x.canFind(3))
printf("Good");
else
printf("Bad");
return 0;
}
在这段代码中,我遇到了链接器错误。所以这里好像不能用canFind
。
如果适合betterC
模式,按功能怎么理解?
如果你想使用-betterC,你需要学习如何阅读link错误信息。该代码不会生成任何关于 canFind 的信息...它实际上是数组文字。
ppp.o: In function `main':
ppp.d:(.text.main[main]+0x8): undefined reference to `_D11TypeInfo_Ai6__initZ'
ppp.d:(.text.main[main]+0xe): undefined reference to `_d_arrayliteralTX'
创建数组 static
,它将起作用。
嗯,为什么? betterC 的规则是它只适用于不需要 D 运行时库的东西。它没有 link 它(因此任何引用运行时函数的函数都会导致 linker 错误),为某些 D 功能生成 C 替代方案(特别是在 betterC 中断言使用 C lib 版本D lib 版本的),并且不会生成其他需要它的代码(因此没有 TypeInfo,任何尝试使用它的东西都会导致 linker 错误)。
缺少 druntime link 解释了为什么这是一个错误:非静态数组文字是运行时库函数的语法糖(恰好在 GC 堆上分配它,因此您可以共享切片无需担心所有权)。因此,它们会在 betterC 中导致 linker 错误。
静态数组只是 exe 数据段中的内存,因此不需要运行时分配,也不需要内存所有权管理(永远不会释放)。因此,他们在 betterC 中工作。
但是,您会问,canFind
来自 Phobos...它没有被 link 编辑!那么,为什么它不产生错误呢?答案是因为它和它所依赖的一切(至少你传递的参数)都是模板。因此,编译器会按需生成所有模板并将其包含在您的 exe 中,而不是从库中引用它。大多数 std.algorithm 都是这样工作的……但是,值得注意的是,如果你给它传递字符串参数就不行了!如果你传递一个字符串,它会尝试解码 UTF 数据(这是一个很大的错误,但今天离题了),这可以 1) 抛出异常和 2) 访问各种 unicode 库函数。所以他们会犯下令人讨厌的错误。您可以通过转换为字节来解决这个问题。
因此您不能依赖 Phobos 在 betterC 中工作,但许多大量模板化的算法都可以工作,因为它们是按需生成的,并且只使用其他模板或与 C 兼容的内置功能。
我正在尝试在 betterC
模式下编译下一个代码:
import core.stdc.stdio;
import std.algorithm;
extern(C):
int main()
{
int [] x = [1,2,3,4,5];
if(x.canFind(3))
printf("Good");
else
printf("Bad");
return 0;
}
在这段代码中,我遇到了链接器错误。所以这里好像不能用canFind
。
如果适合betterC
模式,按功能怎么理解?
如果你想使用-betterC,你需要学习如何阅读link错误信息。该代码不会生成任何关于 canFind 的信息...它实际上是数组文字。
ppp.o: In function `main':
ppp.d:(.text.main[main]+0x8): undefined reference to `_D11TypeInfo_Ai6__initZ'
ppp.d:(.text.main[main]+0xe): undefined reference to `_d_arrayliteralTX'
创建数组 static
,它将起作用。
嗯,为什么? betterC 的规则是它只适用于不需要 D 运行时库的东西。它没有 link 它(因此任何引用运行时函数的函数都会导致 linker 错误),为某些 D 功能生成 C 替代方案(特别是在 betterC 中断言使用 C lib 版本D lib 版本的),并且不会生成其他需要它的代码(因此没有 TypeInfo,任何尝试使用它的东西都会导致 linker 错误)。
缺少 druntime link 解释了为什么这是一个错误:非静态数组文字是运行时库函数的语法糖(恰好在 GC 堆上分配它,因此您可以共享切片无需担心所有权)。因此,它们会在 betterC 中导致 linker 错误。
静态数组只是 exe 数据段中的内存,因此不需要运行时分配,也不需要内存所有权管理(永远不会释放)。因此,他们在 betterC 中工作。
但是,您会问,canFind
来自 Phobos...它没有被 link 编辑!那么,为什么它不产生错误呢?答案是因为它和它所依赖的一切(至少你传递的参数)都是模板。因此,编译器会按需生成所有模板并将其包含在您的 exe 中,而不是从库中引用它。大多数 std.algorithm 都是这样工作的……但是,值得注意的是,如果你给它传递字符串参数就不行了!如果你传递一个字符串,它会尝试解码 UTF 数据(这是一个很大的错误,但今天离题了),这可以 1) 抛出异常和 2) 访问各种 unicode 库函数。所以他们会犯下令人讨厌的错误。您可以通过转换为字节来解决这个问题。
因此您不能依赖 Phobos 在 betterC 中工作,但许多大量模板化的算法都可以工作,因为它们是按需生成的,并且只使用其他模板或与 C 兼容的内置功能。