如何在Chapel中声明对char **类型变量的extern引用?

时间:2018-03-01 03:52:00

标签: chapel

我正在尝试引用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不兼容。我怎样才能得到这个数组的内容?

1 个答案:

答案 0 :(得分:2)

这实际上是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支持文件(除非您找到定义environ的标准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编译器将-Wno-pointer-sign添加到GCC(您可以使用chpl env.chpl --print-commands看到)并且可能还需要抛出-Wno-incompatible-pointer-types。但是,在这种情况下,-Wno-pointer-sign不足以压制海湾合作委员会的警告,我感到很惊讶。