gpt4 book ai didi

chapel - 如何在 Chapel 中声明对 char** 类型变量的外部引用?

转载 作者:行者123 更新时间:2023-12-01 15:28:40 25 4
gpt4 key购买 nike

我正在尝试引用 C char **environ,但我不知道如何在 Chapel 中声明该变量。我已经尝试了一些方法,但编译器生成的代码由于类型不匹配而导致后端编译器无法编译。

即使只是想写点东西:

extern var environ: c_ptr(c_string);
writeln(环境);

c_ptr(c_string) 生成 const char** 类型的 C var。

c_ptr(c_ptr(c_char)) 类型之一 signed char **

c_ptr(c_ptr(c_uchar)) unsigned char **

c_ptr(c_void_ptr)一个void**

所有这些都与 char **environ 不兼容。我怎样才能得到这个数组的内容?

最佳答案

这实际上是与 C 的集成问题(因为 Chapel 编译器当前默认生成 C 代码)并且表示 C 的类型系统和 Chapel 的类型系统之间存在阻抗不匹配的地方。

只是为了好玩,让我们使用外部 block 和 LLVM 后端编写这个程序。

// env.chpl
extern {
extern char** environ;
}

writeln(environ);

现在我们将编译并运行它:

chpl env.chpl  --llvm
./env

它输出一个指针地址。看?这是一个 C 问题。

如果你想继续使用 C 后端,你必须这样做:

// env.chpl
require "c-environ.h";
extern var environ: c_ptr(c_ptr(c_char));
writeln(environ);

使用此 C 支持文件(除非您找到定义环境的标准 C 头文件,否则需要此文件):

// c-environ.h
extern char **environ;

编译那个

chpl env.chpl --ccflags -Wno-incompatible-pointer-types  

它的工作原理与使用 LLVM 后端的版本类似。 (而且,如果您不添加 -Wno-incompatible-pointer-types,您应该会看到来自 C 编译器的警告,程序仍然可以运行。请注意 --devel/CHPL_DEVELOPER=1将打开来自 C 编译器的 warnings-are-errors)。

尽管如此,可能值得在 Chapel 项目上创建一个问题和/或使用 GCC/您正在使用的任何 C 编译器提交错误。 Chapel 编译器将 -Wno-pointer-sign 添加到 GCC(您可以通过 chpl env.chpl --print-commands 查看)并且可能还需要抛出 -Wno-incompatible-pointer-types。但是,令我惊讶的是,在这种情况下,-Wno-pointer-sign 不足以消除来自 GCC 的警告。

关于chapel - 如何在 Chapel 中声明对 char** 类型变量的外部引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49042355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com