如何在 Chapel 中声明对 char** 类型变量的外部引用?
How can I declare an extern reference to a variable of type char** in Chapel?
我正在尝试引用 C char **environ
,但我不知道如何在 Chapel 中声明变量。我尝试了一些方法,但编译器生成的代码由于类型不匹配而导致后端编译器无法编译。
即使只是想写点东西:
extern var environ: c_ptr(c_string);
writeln(environ);
c_ptr(c_string)
生成类型为 const char**
的 C 变量。
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 的类型系统之间存在阻抗不匹配的地方。
为了好玩,让我们使用外部块和 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 项目上创建一个问题 and/or 提交一个关于你正在使用的 GCC/whatever C 编译器的错误,不过。 Chapel 编译器将 -Wno-pointer-sign
添加到 GCC(您可以通过 chpl env.chpl --print-commands
看到)并且可能还需要抛出 -Wno-incompatible-pointer-types
。但是,我很惊讶在这种情况下 -Wno-pointer-sign
不足以消除来自 GCC 的警告。
我正在尝试引用 C char **environ
,但我不知道如何在 Chapel 中声明变量。我尝试了一些方法,但编译器生成的代码由于类型不匹配而导致后端编译器无法编译。
即使只是想写点东西:
extern var environ: c_ptr(c_string);
writeln(environ);
c_ptr(c_string)
生成类型为 const char**
的 C 变量。
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 的类型系统之间存在阻抗不匹配的地方。
为了好玩,让我们使用外部块和 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 项目上创建一个问题 and/or 提交一个关于你正在使用的 GCC/whatever C 编译器的错误,不过。 Chapel 编译器将 -Wno-pointer-sign
添加到 GCC(您可以通过 chpl env.chpl --print-commands
看到)并且可能还需要抛出 -Wno-incompatible-pointer-types
。但是,我很惊讶在这种情况下 -Wno-pointer-sign
不足以消除来自 GCC 的警告。