Nim argv 等价物

Lex*_*Lex 1 arguments nim-lang

我正在与 Nim 连接一个 C 实用程序。C utilmain函数需要argcargv。我可以从中获取 argc,paramCount但是如何获取 argv 的 C 兼容 args 列表?

int main (int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)
proc main*(argc: cint; argv: cstringArray): cint
Run Code Online (Sandbox Code Playgroud)

xbe*_*llo 5

你有你的字符串变量序列:

var data: seq[string] = @["A", "B", "C", "D"]
Run Code Online (Sandbox Code Playgroud)

然后在将它发送到 C 函数之前分配它:

var cdata: cstringArray = data.allocCStringArray()
main(5, cdata)
cdata.deallocCStringArray()
Run Code Online (Sandbox Code Playgroud)


Ant*_*hon 5

除此之外paramCount()还有paramStr()实际获取参数字符串的函数。

如果您的 C 程序是:

int cmain(int argc, char **argv)
{ 
  int x;
  for (x=0; x < argc; x++)
    printf("%d: %s\n", x, argv[x]);
}
Run Code Online (Sandbox Code Playgroud)

然后您的 Nim 程序test.nim需要将重复paramStr()调用返回的值转换为兼容的char **

{.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()
Run Code Online (Sandbox Code Playgroud)

然后运行nim c -r test.nim def ghi给出:

0: def
1: ghi
Run Code Online (Sandbox Code Playgroud)

(使用compile编译指示,您不需要从 C 文件创建共享对象,并链接到它,当然这也是可能的)