Пожалуйста, объясните, как работает эта функция программы C?

Я читаю книгу Системное программирование Windows. Во второй главе есть программа Cat.c, которая реализует команду cat в linux. Код: 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

а) Что будет argc и почему? б) Каким будет argv и почему? в) Что такое _T("s")? Почему здесь используется _T? г) Почему используется &dashS? Скорее всего, это адрес логического значения. Но я не могу понять логику использования этого. e) Почему они передали NULL в качестве последнего параметра?

У меня есть базовые знания программирования на C, и эти вещи действительно сбивают с толку. Так будь любезен, объясни.


person narayanpatra    schedule 10.09.2013    source источник
comment
... известен как переменный список аргументов. Надеюсь, это поможет в поиске в Google.   -  person Cornstalks    schedule 10.09.2013
comment
Я объяснил здесь: передать много аргументов функции C   -  person Grijesh Chauhan    schedule 10.09.2013
comment
Для № 2 вы можете написать базовую программу, которая принимает его и печатает каждый   -  person Karthik T    schedule 10.09.2013
comment
Ядро Windows, а также ядра многих других ОС (в основном) написаны на C, поэтому, прежде чем читать о системном программировании, было бы неплохо прочитать о C.   -  person alk    schedule 10.09.2013
comment
Я читал C. Но это сложные программы, не описанные в книгах. Я никогда не видел списка переменных аргументов в книгах по C.   -  person narayanpatra    schedule 10.09.2013
comment
argc arg v - это способ C для получения и использования аргументов, отправляемых в exe, должно быть много документации, даже если последний аргумент равен NULL. _T(string) — это макрос Microsoft TCHAR, который преобразует строку в ANSI или Unicode в зависимости от определения препроцессора макроса UNICODE.   -  person ColdCat    schedule 10.09.2013
comment
I never saw variable argument list in C books. -- Пришло время потребовать возмещения у авторов соответствующих книг.   -  person devnull    schedule 10.09.2013
comment
Известные функции, такие как printf и scanf, являются переменными аргументами, возможно, вы можете проверить их.   -  person Yu Hao    schedule 10.09.2013


Ответы (2)


Здесь у вас есть два разных типа «переменных» списков аргументов.

Во-первых, у вас есть аргументы, переданные программе в командной строке, очевидно, что человек может вызвать программу из командной строки со многими аргументами.

 cat file1 file2 file3

и так далее. main() программ C с первых дней существования C предоставлял доступ к аргументам командной строки в переменных argc и argv, argc — это количество аргументов (3 + имя самой программы в моем примере выше) а 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, о котором вы спрашиваете.

person djna    schedule 10.09.2013
comment
Небольшая вещь, но argv[0] обычно является именем исполняемого двоичного файла (хотя на самом деле оно также не определено). Ответ цитирует C99 здесь: stackoverflow.com/a/2051031/1708197 - person rliu; 10.09.2013
comment
Я понял полностью. Большое Вам спасибо. - person narayanpatra; 10.09.2013

1) «...» - это список переменных аргументов, как указало имя пользователя Cornstalks. Это позволяет таким функциям, как printf(), иметь переменное количество аргументов, но их тип и количество аргументов должны быть указаны в одном из аргументов (например, строка форматирования для printf()< /сильный>). См. *va_list.h* или stdarg.h.

2) а) argc — количество аргументов, указанных в командной строке.

б) argv — это массив аргументов, это массив строк.

c) _T() — это макрос, я знаю его как TEXT(). По сути, это позволяет программистам использовать либо строки ASCII, либо строки Unicode во время сборки без необходимости изменять весь код. Если определен макрос UNICODE, строка, указанная в качестве аргумента макроса _T(), становится L"string", иначе она становится "строка". Вот почему некоторые функции имеют последнюю букву A или W. Например, OutputDebugString по умолчанию имеет значение OutputDebugStringW, если определено UNICODE, и OutputDebugStringA, если UNICODE не определено. Функции, в имени которых есть последняя буква A, принимают только строки ASCII, а W — только строки Unicode. Для этой цели также определен тип, TCHAR по умолчанию используется либо CHAR, либо WCHAR, а также есть еще одна точка входа, т. е. _tmain ().

г) &variable означает адрес переменной. Он используется для передачи функции местоположения в памяти содержимого переменной, так что, если функция изменяет значение переменной, переменная изменяется везде, где она используется.

e) Вам нужно будет посмотреть на прототип функции.

Мне кажется, что вы были введены в заблуждение, полагая, что начать программирование Windows — это путь, если вы хотите научиться программировать. Языки программирования C и C++ по умолчанию не зависят от ОС, и вам следует сначала изучить независимую часть. Я рекомендую "Программирование на C: современный подход".

person Sebastian-Laurenţiu Plesciuc    schedule 10.09.2013