0

我正在阅读这本书Windows 系统编程。第二章有一个程序 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 编程的基本知识,这些东西真的很混乱。所以请解释一下。

4

2 回答 2

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”。

接下来,您正在查看的函数本身采用不定数量的参数,如省略号所示 - ...

您需要阅读有关可变参数的信息。这是最早的 C 语言中没有的语言功能,并且被认为有点高级,因此您的某些书籍可能不会涵盖它,或者直到本书后期才涉及。这里的关键点是我们解释变量列表时我们需要知道何时到达变量列表的末尾,我们没有“argc”等价物。所以我们在函数调用中放了一个“这是最后一个,停在这里”的值,这就是你问的 NULL。

于 2013-09-10T07:02:46.233 回答
1

1)“...”是用户名 Cornstalks 指出的变量参数列表。它允许printf()之类的函数具有可变数量的参数,但它们的类型和参数数量必须在其中一个参数中指定(例如printf()的格式化字符串)。请参阅 *va_list.h* 或stdarg.h

2) a) argc是在命令行中指定的参数数量。

b) argv是参数数组,它是一个字符串数组。

c) _T()是一个宏,我知道它为TEXT()。基本上,它允许程序员在构建时使用 ASCII 字符串或 Unicode 字符串,而无需修改整个代码。如果定义了UNICODE宏,则指定为_T()宏的参数的字符串变为L"string",否则变为"string"。这就是为什么有些函数的最后一个字母是 A 或 W。例如,如果定义了UNICODEOutputDebugStringA ,则OutputDebugString默认为OutputDebugStringW如果未定义 UNICODE。名称中最后一个字母为 A 的函数只接受 ASCII 字符串,而 W 只接受 Unicode 字符串。为此还定义了一个类型,TCHAR默认为CHARWCHAR,还有另一个入口点,即_tmain()

d) &variable表示变量的地址。它用于将变量内容在内存中的位置传递给函数,以便如果函数修改变量的值,则变量在其他任何使用它的地方都会被修改。

e) 您必须查看函数原型。

在我看来,您似乎被误导了,如果您想学习编程,那么开始 Windows 编程是必经之路。C 和 C++ 编程语言默认是独立于操作系统的,你应该先学习独立的部分。我推荐“C 编程:一种现代方法”。

于 2013-09-10T07:12:24.513 回答