Nim argv 等价物

Nim argv equivalent

我正在将 C 实用程序与 Nim 连接起来。 C util main 函数需要 argcargv。我可以从 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 反对它,当然这也是可能的)