我正在阅读这本书Windows System Programming。在第二章中,有一个程序Cat.c,它实现了linux的cat命令。代码为http://pastebin.com/wwQFp599
在第20行,一个函数被称为
iFirstFile = Options (argc, argv, _T("s"), &dashS, NULL);
选项代码为http://pastebin.com/QegxxFpn
现在,选项的参数是
(int argc, LPCTSTR argv [], LPCTSTR OptStr, ...)
1)这是什么“......”?这是否意味着我们可以提供无限数量的LPCTSTR类型的参数?
2)如果我执行该程序为 cat -s a.txt
a)argc会是什么?为什么? b)什么是argv以及为什么? c)什么是_T(“s”)?为什么在这里使用_T? d)为什么使用& dashS?它最有可能是布尔的地址。但我无法理解使用此背后的逻辑。 e)为什么他们将NULL作为最后一个参数传递?
我有C编程的基础知识,这些东西真的很混乱。请好好解释一下。
答案 0 :(得分:1)
这里有两种不同的“变量”参数列表。
首先,你在命令行中传递给程序的参数,显然一个人可以从命令行调用带有许多参数的程序
cat file1 file2 file3
等等。 C程序的main()从C的早期开始就可以访问变量argc和argv中的命令行参数,argc是多少个参数的计数(3 +上面例子中pogram本身的名称)和argv是参数的数组(实际上是一个指向字符串的指针数组)所以在这种情况下我们可以访问argv [0],argv [1],arv [2]和argv [3],因为argc知道要停在那里告诉我们有四个论点。
因此,在您的示例中,argc将为3,argv [0]将指向“cat”,argv [1]指向“-s”,argv [2]指向“a.txt”。
接下来,您正在查看的函数会使用不同数量的参数,如elipses所示 - ...
您需要阅读有关变量参数的内容。这是一种语言功能,不是最早的C语言,并且被认为有点先进,因此你的一些书可能无法覆盖它,或者直到书的最后才开始。这里的关键点是,当我们到达变量列表的末尾时,我们解释了我们需要知道的变量列表,我们没有“argc”等价物。所以我们在函数调用中放了一个“这是最后一个,停在这里”的值,这就是你问的NULL。
答案 1 :(得分:1)
1)“...”是一个可变参数列表,作为用户名Cornstalks指出。它允许像 printf()这样的函数具有可变数量的参数,但是它们的类型和参数数量必须在其中一个参数中指定(比如 printf()的格式化字符串< /强>)。请参阅* va_list.h *或 stdarg.h 。
2)a) argc 是在命令行指定的参数数量。
b) argv 是参数数组,它是一个字符串数组。
c) _T()是一个宏,我知道它是 TEXT()。基本上,它允许程序员在构建时使用ASCII字符串或Unicode字符串,而无需修改整个代码。如果定义 UNICODE 宏,则指定为 _T()宏的参数的字符串将变为 L“string”,否则它将变为 “字符串”。这就是为什么有些函数将A或W作为最后一个字母的原因。例如,如果定义了 UNICODE ,则 OutputDebugString 默认为 OutputDebugStringW ;如果未定义UNICODE,则 OutputDebugStringA 。在其名称中以A作为最后一个字母的函数仅接受ASCII字符串,而W仅接受Unicode字符串。还有为此目的定义的类型, TCHAR 默认为 CHAR 或 WCHAR ,还有另一个入口点,即 _tmain ()强>
d)&amp; variable 表示变量的地址。它用于将函数传递给变量内容的内存中的位置,这样如果函数修改变量的值,变量就会在其他地方被修改。
e)你必须看一下函数原型。
在我看来,如果你想学习编程,你会被误导相信启动Windows编程是一种方法。默认情况下,C和C ++编程语言与操作系统无关,您应该首先学习独立部分。我推荐“C编程:现代方法”。