在Visual Studio2010中,如何在程序运行前添加参数argc和argv?

在Visual Studio2010中,如何在程序运行前添加参数argc和argv?,第1张

main (int argc, char *argv[]){

}

argc -- 命令行参数总个数,包括程序名。

argv[0] -- 程序名

argv[1] -- 命令行参数1

argv[2] -- 命令行参数2

argv[i] -- 命令行参数i

命令行参数,通过 argv[] 传入 主程序,供程序员使用。

------------

API 程序

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)

通过

LPTSTR argv

argv = GetCommandLine() // 用这个函数 获取,

==================================================

例如,命令行 内容:

my_prog.exe 123 456.7 a.dat

argc -- 4 整型

argv[0] -- "my_prog.exe" 字符串

argv[1] -- "123" 字符串

argv[2] -- "456.7" 字符串

argv[3] -- "a.dat" 字符串

一般来说,Python程序员可能是这样写main()函数的:

"""Module docstring.

This serves as a long usage message.

"""import sysimport getoptdef main():

# parse command line options

try:

opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])except getopt.error, msg:print msgprint "for help use --help"

sys.exit(2)# process options

for o, a in opts:if o in ("-h", "--help"):print __doc__

sys.exit(0)# process arguments

for arg in args:

process(arg) # process() is defined elsewhereif __name__ == "__main__":

main()1234567891011121314151617181920212223242526

Guido也承认之前自己写的main()函数也是类似的结构,但是这样写的灵活性还不够高,尤其是需要解析复杂的命令行选项时。为此,他向大家提出了几点建议。

添加可选的 argv 参数

首先,修改main()函数,使其接受一个可选参数 argv,支持在交互式shell中调用该函数:

def main(argv=None):

if argv is None:

argv = sys.argv# etc., replacing sys.argv with argv in the getopt() call.1234

这样做,我们就可以动态地提供 argv 的值,这比下面这样写更加的灵活:

def main(argv=sys.argv):

# etc.12

这是因为在调用函数时,sys.argv 的值可能会发生变化;可选参数的默认值都是在定义main()函数时,就已经计算好的。

但是现在sys.exit()函数调用会产生问题:当main()函数调用sys.exit()时,交互式解释器就会推出!解决办法是让main()函数的返回值指示退出状态(exit status)。因此,最后面的那行代码就变成了这样:

if __name__ == "__main__":

sys.exit(main())12

并且,main()函数中的sys.exit(n)调用全部变成return n。

定义一个Usage()异常

另一个改进之处,就是定义一个Usage()异常,可以在main()函数最后的except子句捕捉该异常:

import sysimport getoptclass Usage(Exception):

def __init__(self, msg):

self.msg = msgdef main(argv=None):

if argv is None:

argv = sys.argvtry:try:

opts, args = getopt.getopt(argv[1:], "h", ["help"])except getopt.error, msg:raise Usage(msg)# more code, unchanged

except Usage, err:print >>sys.stderr, err.msgprint >>sys.stderr, "for help use --help"

return 2if __name__ == "__main__":

sys.exit(main())123456789101112131415161718192021222324

这样main()函数就只有一个退出点(exit)了,这比之前两个退出点的做法要好。而且,参数解析重构起来也更容易:在辅助函数中引发Usage的问题不大,但是使用return 2却要求仔细处理返回值传递的问题。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11392194.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存