我正在尝试引用C char **environ
,但是我不知道如何在Chapel中声明变量。我已经尝试了一些方法,但是编译器生成的代码由于类型不匹配而导致后端编译器无法编译。
即使只是试图写点东西:extern var environ: c_ptr(c_string);writeln(environ);
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的类型之间的阻抗不匹配。
只是为了好玩,让我们使用extern块和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编译器的错误)。
不过,可能值得在Chapel项目上创建问题和/或使用GCC /您正在使用的任何C编译器提交错误,尽管如此。 Chapel编译器在GCC中添加了
-Wno-pointer-sign
(可以通过chpl env.chpl --print-commands
看到),也许还需要抛出-Wno-incompatible-pointer-types
。但是,在这种情况下,我感到惊讶的是-Wno-pointer-sign
不足以抑制来自GCC的警告。关于chapel - 如何在Chapel中声明对char **类型变量的外部引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49042355/