Nim argv 等价物
Nim argv equivalent
我正在将 C 实用程序与 Nim 连接起来。 C util main
函数需要 argc 和 argv。我可以从 paramCount
获取 argc,但如何获取 argv 的 C 兼容参数列表?
int main (int argc, char **argv);
proc main*(argc: cint; argv: cstringArray): cint
你有你的字符串序列变量:
var data: seq[string] = @["A", "B", "C", "D"]
并且在将它发送到 C 函数之前对其进行分配:
var cdata: cstringArray = data.allocCStringArray()
main(5, cdata)
cdata.deallocCStringArray()
除了paramCount()
还有函数paramStr()
实际上获取参数字符串。
如果你的 C 程序是:
int cmain(int argc, char **argv)
{
int x;
for (x=0; x < argc; x++)
printf("%d: %s\n", x, argv[x]);
}
然后你的 Nim 程序 test.nim
, 需要转换返回值
对兼容 char **
:
的重复 paramStr()
调用
{.compile: "cmain.c".}
proc cmain(c: cint, a: cstringArray): cint {.importc.}
import os
var nargv = newSeq[string](paramCount())
var x = 0
while x < paramCount():
nargv[x] = paramStr(x+1) # first is program name
x += 1
var argv: cStringArray = nargv.allocCStringArray()
discard cmain(cint(paramCount()), argv)
argv.deallocCStringArray()
然后 运行 nim c -r test.nim def ghi
给出:
0: def
1: ghi
(使用 compile
pragma 你不需要从你的 C 文件创建一个共享对象,并且 link 反对它,当然这也是可能的)
我正在将 C 实用程序与 Nim 连接起来。 C util main
函数需要 argc 和 argv。我可以从 paramCount
获取 argc,但如何获取 argv 的 C 兼容参数列表?
int main (int argc, char **argv);
proc main*(argc: cint; argv: cstringArray): cint
你有你的字符串序列变量:
var data: seq[string] = @["A", "B", "C", "D"]
并且在将它发送到 C 函数之前对其进行分配:
var cdata: cstringArray = data.allocCStringArray()
main(5, cdata)
cdata.deallocCStringArray()
除了paramCount()
还有函数paramStr()
实际上获取参数字符串。
如果你的 C 程序是:
int cmain(int argc, char **argv)
{
int x;
for (x=0; x < argc; x++)
printf("%d: %s\n", x, argv[x]);
}
然后你的 Nim 程序 test.nim
, 需要转换返回值
对兼容 char **
:
paramStr()
调用
{.compile: "cmain.c".}
proc cmain(c: cint, a: cstringArray): cint {.importc.}
import os
var nargv = newSeq[string](paramCount())
var x = 0
while x < paramCount():
nargv[x] = paramStr(x+1) # first is program name
x += 1
var argv: cStringArray = nargv.allocCStringArray()
discard cmain(cint(paramCount()), argv)
argv.deallocCStringArray()
然后 运行 nim c -r test.nim def ghi
给出:
0: def
1: ghi
(使用 compile
pragma 你不需要从你的 C 文件创建一个共享对象,并且 link 反对它,当然这也是可能的)