ÐÑимеÑание.
ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к ÑÑой ÑÑÑаниÑе ÑÑебÑеÑÑÑ Ð°Ð²ÑоÑизаÑиÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе попÑобоваÑÑ Ð²Ð¾Ð¹Ñи или измениÑÑ ÐºÐ°Ñалоги.
ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к ÑÑой ÑÑÑаниÑе ÑÑебÑеÑÑÑ Ð°Ð²ÑоÑизаÑиÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе попÑобоваÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÐºÐ°Ñалоги.
ÐÑе пÑогÑÐ°Ð¼Ð¼Ñ C++ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ ÑÑнкÑÐ¸Ñ main . ÐÑи попÑÑке ÑкомпилиÑоваÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ C++ без main ÑÑнкÑии компилÑÑÐ¾Ñ Ð²ÑзÑÐ²Ð°ÐµÑ Ð¾ÑибкÑ. (ÐиблиоÑеки и static библиоÑеки динамиÑеÑкой main компоновки не имеÑÑ ÑÑнкÑии.) ФÑнкÑÐ¸Ñ main заклÑÑаеÑÑÑ Ð² Ñом, где наÑинаеÑÑÑ Ð²Ñполнение иÑÑ
одного кода, но пеÑед вводом main пÑогÑÐ°Ð¼Ð¼Ñ Ð² ÑÑнкÑÐ¸Ñ Ð²Ñе static ÑÐ»ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа без ÑвнÑÑ
иниÑиализаÑоÑов Ð·Ð°Ð´Ð°Ð½Ñ ÑавнÑм нÑлÑ. Ð Microsoft C++глобалÑнÑе static обÑекÑÑ Ñакже иниÑиализиÑÐ¾Ð²Ð°Ð½Ñ Ð¿ÐµÑед запиÑÑÑ main. ÐеÑколÑко огÑаниÑений main пÑименÑÑÑÑÑ Ðº ÑÑнкÑии, коÑоÑÐ°Ñ Ð½Ðµ пÑименÑеÑÑÑ Ðº дÑÑгим ÑÑнкÑиÑм C++. ФÑнкÑÐ¸Ñ main:
- Ðевозможно пеÑегÑÑжаÑÑ (Ñм . пеÑегÑÑÐ·ÐºÑ ÑÑнкÑии).
- Ðевозможно обÑÑвиÑÑ ÐºÐ°Ðº
inline. - Ðевозможно обÑÑвиÑÑ ÐºÐ°Ðº
static. - Ðе ÑдаеÑÑÑ Ð¿ÑинÑÑÑ Ñвой адÑеÑ.
- Ðе ÑдаеÑÑÑ Ð²ÑзваÑÑ Ð¸Ð· пÑогÑаммÑ.
СигнаÑÑÑа main ÑÑнкÑии
ФÑнкÑÐ¸Ñ main не Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÑвлениÑ, Ñак как она вÑÑÑоена в ÑзÑк. ÐÑли ÑÑо ÑделаÑÑ, ÑинÑакÑÐ¸Ñ main обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÑледÑÑÑим обÑазом:
int main();
int main(int argc, char *argv[]);
ÐÑли возвÑаÑаемое знаÑение не Ñказано, mainкомпилÑÑÐ¾Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемое знаÑение нÑлÑ.
СÑандаÑÑнÑе аÑгÑменÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки
ÐÑгÑменÑÑ Ð´Ð»Ñ main обеÑпеÑÐµÐ½Ð¸Ñ Ñдобного анализа аÑгÑменÑов командной ÑÑÑоки. Ð¢Ð¸Ð¿Ñ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов argc и argv опÑеделÑÑÑÑÑ ÑзÑком. Ðмена argc и argv ÑвлÑÑÑÑÑ ÑÑадиÑионнÑми, но Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе назваÑÑ Ð¸Ñ
незавиÑимо Ð¾Ñ Ñого, ÑÑо Ð²Ñ Ñ
оÑиÑе.
ÐÑполÑзÑÑÑÑÑ ÑледÑÑÑие опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов.
argc
Целое ÑиÑло, ÑодеÑжаÑее колиÑеÑÑво аÑгÑменÑов, коÑоÑÑе ÑледÑÑÑ Ð² argv. ÐаÑамеÑÑ argc вÑегда болÑÑе или Ñавен 1.
argv
ÐаÑÑив завеÑÑаÑÑиÑ
ÑÑ null ÑÑÑок, пÑедÑÑавлÑÑÑиÑ
введеннÑе полÑзоваÑелем пÑогÑÐ°Ð¼Ð¼Ñ Ð°ÑгÑменÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки. Ðо ÑоглаÑÐµÐ½Ð¸Ñ â ÑÑо команда, argv[0] Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑой вÑзÑваеÑÑÑ Ð¿ÑогÑамма.
argv[1] â пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки. ÐоÑледний аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð· командной ÑÑÑоки Ð¸Ð¼ÐµÐµÑ argv[argc - 1]argv[argc] знаÑение NULL.
Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñом, как оÑклÑÑиÑÑ Ð¾Ð±ÑабоÑÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки, Ñм. в Ñазделе "ÐаÑÑÑойка обÑабоÑки командной ÑÑÑоки C++".
ÐÑимеÑание.
Ðо ÑоглаÑÐµÐ½Ð¸Ñ argv[0] â ÑÑо Ð¸Ð¼Ñ Ñайла пÑогÑаммÑ. Ðднако в Windows можно ÑоздаÑÑ Ð¿ÑоÑеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CreateProcess. ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе оба пеÑвÑÑ
и вÑоÑого аÑгÑменÑа (lpApplicationName и lpCommandLine), argv[0] Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ Ð¸ÑполнÑемÑм именем. Ðожно иÑполÑзоваÑÑ GetModuleFileName Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого имени и полного пÑÑи.
РаÑÑиÑениÑ, оÑноÑÑÑиеÑÑ Ðº ÐоÑпоÑаÑии ÐайкÑоÑоÑÑ
Ð ÑледÑÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ Ð¾Ð¿Ð¸Ñано поведение майкÑоÑоÑÑ.
wmain ФÑнкÑÐ¸Ñ Ð¸ _tmain макÑоÑ
ÐÑли Ð²Ñ ÑазÑабаÑÑваеÑе иÑÑ
однÑй код Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑиÑеннÑÑ
Ñимволов Юникода, можно иÑполÑзоваÑÑ ÑоÑÐºÑ Ð²Ñ
ода, опÑеделеннÑÑ wmain коÑпоÑаÑией ÐайкÑоÑоÑÑ, коÑоÑÐ°Ñ ÑвлÑеÑÑÑ ÑиÑокой веÑÑией Ñимволов main. Ðиже пÑиведен ÑинÑакÑÐ¸Ñ ÑÑÑекÑивного обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ wmain:
int wmain();
int wmain(int argc, wchar_t *argv[]);
ÐÑ Ñакже можеÑе иÑполÑзоваÑÑ Ð¾Ð¿ÑеделеннÑй коÑпоÑаÑией ÐайкÑоÑоÑÑ _tmainмакÑÐ¾Ñ Ð¿ÑепÑоÑеÑÑоÑа, опÑеделеннÑй в tchar.h.
_tmain ÑазÑеÑаеÑ, main еÑли _UNICODE не опÑеделено. РпÑоÑивном ÑлÑÑае ÑÑнкÑÐ¸Ñ _tmain ÑазÑеÑаеÑÑÑ Ð² ÑÑнкÑÐ¸Ñ wmain. ÐакÑÐ¾Ñ _tmain и дÑÑгие макÑоÑÑ, наÑинаÑÑиеÑÑ Ñ _t , Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð´Ð°, коÑоÑÑй должен ÑоздаваÑÑ Ð¾ÑделÑнÑе веÑÑии Ð´Ð»Ñ ÑзкиÑ
и ÑиÑокиÑ
набоÑов Ñимволов. ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в Ñазделе "ÐÑполÑзование ÑнивеÑÑалÑнÑÑ
ÑекÑÑовÑÑ
ÑопоÑÑавлений".
void ÐозвÑÐ°Ñ Ð¸Ð·main
Ðак ÑаÑÑиÑение ÐайкÑоÑоÑÑ, mainwmain ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº возвÑаÑаемÑе void (без возвÑаÑаемого знаÑениÑ). ÐÑо ÑаÑÑиÑение Ñакже доÑÑÑпно в некоÑоÑÑÑ
дÑÑгиÑ
компилÑÑоÑаÑ
, но его иÑполÑзование не ÑекомендÑеÑÑÑ. Ðн доÑÑÑпен Ð´Ð»Ñ ÑиммеÑÑии, еÑли main не возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение.
ÐÑи обÑÑвлении main или возвÑаÑе wmainкода в ÑодиÑелÑÑкий пÑоÑеÑÑ Ð¸Ð»Ð¸ void опеÑаÑионнÑÑ ÑиÑÑÐµÐ¼Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ веÑнÑÑÑ exit Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½ÑÑÑÑкÑииreturn. ЧÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑ exit код, когда main или wmain как voidобÑÑвлен, необÑ
одимо иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ exit .
envp ÐÑгÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки
main СигнаÑÑÑÑ wmain позволÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð¾Ð¼Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð°Ð¹ÐºÑоÑоÑÑ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к пеÑеменнÑм ÑÑедÑ. ÐÑо ÑаÑÑиÑение Ñакже ÑаÑпÑоÑÑÑанено в дÑÑгиÑ
компилÑÑоÑаÑ
Ð´Ð»Ñ ÑиÑÑем Windows и UNIX. ÐÐ¼Ñ envp ÑÑадиÑионное, но можно пÑиÑвоиÑÑ Ð¿Ð°ÑамеÑÑÑ ÑÑÐµÐ´Ñ Ð»Ñбое имÑ. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð´ÐµÐ¹ÑÑвÑÑÑие обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑпиÑков аÑгÑменÑов, вклÑÑаÑÑиÑ
паÑамеÑÑ ÑÑедÑ:
int main(int argc, char* argv[], char* envp[]);
int wmain(int argc, wchar_t* argv[], wchar_t* envp[]);
envp
ÐеобÑзаÑелÑнÑй envp паÑамеÑÑ â ÑÑо маÑÑив ÑÑÑок, пÑедÑÑавлÑÑÑий пеÑеменнÑе, заданнÑе в ÑÑеде полÑзоваÑелÑ. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив завеÑÑаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑÑ NULL. Ðго можно обÑÑвиÑÑ ÐºÐ°Ðº маÑÑив ÑказаÑелей char на (char *envp[]) или как ÑказаÑÐµÐ»Ñ Ð½Ð° ÑказаÑели char на (char **envp). ÐÑли пÑогÑамма иÑполÑзÑÐµÑ wmain вмеÑÑо mainÑÑого, иÑполÑзÑйÑе wchar_t вмеÑÑо него Ñип charданнÑÑ
.
Ðлок ÑÑедÑ, пеÑеданнÑй main и wmain ÑвлÑеÑÑÑ "замоÑоженнÑм" копией ÑекÑÑей ÑÑедÑ. ÐÑли Ð²Ñ Ð¿Ð¾Ð·Ð¶Ðµ измениÑе ÑÑедÑ, вÑполнив вÑзов putenv или_wputenv, ÑекÑÑÐ°Ñ ÑÑеда (возвÑаÑÐ°ÐµÐ¼Ð°Ñ getenv или _wgetenv_environ_wenviron пеÑеменнаÑ) измениÑÑÑ, но блок, на коÑоÑÑй ÑказÑваеÑ, envp не измениÑÑÑ. ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ подавлении обÑабоÑки ÑÑÐµÐ´Ñ Ñм. в Ñазделе "ÐаÑÑÑойка обÑабоÑки командной ÑÑÑоки C++". ÐÑгÑÐ¼ÐµÐ½Ñ envp ÑовмеÑÑим Ñо ÑÑандаÑÑом C89, но не Ñо ÑÑандаÑÑами C++.
ÐÑимеÑÑ Ð°ÑгÑменÑов main
Ð ÑледÑÑÑем пÑимеÑе показано, как иÑполÑзоваÑÑ argcаÑгÑменÑÑ Ð¸ argvenvpаÑгÑменÑÑ mainдлÑ:
// argument_definitions.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
int main( int argc, char *argv[], char *envp[] )
{
bool numberLines = false; // Default is no line numbers.
// If /n is passed to the .exe, display numbered listing
// of environment variables.
if ( (argc == 2) && _stricmp( argv[1], "/n" ) == 0 )
numberLines = true;
// Walk through list of strings until a NULL is encountered.
for ( int i = 0; envp[i] != NULL; ++i )
{
if ( numberLines )
cout << i << ": "; // Prefix with numbers if /n specified
cout << envp[i] << "\n";
}
}
Ðнализ аÑгÑменÑов командной ÑÑÑоки C++
ÐÑавила ÑинÑакÑиÑеÑкого анализа командной ÑÑÑоки, иÑполÑзÑемÑе кодом Microsoft C/C++, оÑноÑÑÑÑÑ Ðº коÑпоÑаÑии ÐайкÑоÑоÑÑ. Ðод запÑÑка ÑÑÐµÐ´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÐµÑ ÑÑи пÑавила пÑи инÑеÑпÑеÑаÑии аÑгÑменÑов, заданнÑÑ Ð² командной ÑÑÑоке опеÑаÑионной ÑиÑÑемÑ:
ÐÑгÑменÑÑ ÑазделÑÑÑÑÑ Ð¿Ñобелами (пÑобел или ÑабÑлÑÑиÑ).
ÐеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ (
argv[0]) обÑабаÑÑваеÑÑÑ Ð¾ÑобÑм обÑазом. Ðн пÑедÑÑавлÑÐµÑ Ð¸Ð¼Ñ Ð¿ÑогÑаммÑ. ÐÑо должен бÑÑÑ Ð´Ð¾Ð¿ÑÑÑимÑй пÑÑÑ, поÑÑÐ¾Ð¼Ñ ÑазÑеÑÐµÐ½Ñ ÑаÑÑи, заклÑÑеннÑе в двойнÑе кавÑÑки ("). ÐÑи знаки двойнÑÑ ÐºÐ°Ð²ÑÑек не вклÑÑаÑÑÑÑ Ð² вÑÑ Ð¾Ð´Ð½Ñе даннÑеargv[0]. ÐаклÑÑение ÑаÑÑей в двойнÑе кавÑÑки не позволÑÐµÑ Ð¸Ð½ÑеÑпÑеÑиÑоваÑÑ Ð¿Ñобел или Ñимвол ÑабÑлÑÑии как ÐºÐ¾Ð½ÐµÑ Ð°ÑгÑменÑа. ÐоÑледÑÑÑие пÑавила в ÑÑом ÑпиÑке не пÑименÑÑÑÑÑ.СÑÑока, окÑÑÐ¶ÐµÐ½Ð½Ð°Ñ Ð´Ð²Ð¾Ð¹Ð½Ñми кавÑÑками, инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº один аÑгÑменÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ñобела. СÑÑÐ¾ÐºÑ Ð² кавÑÑÐºÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑÑоиÑÑ Ð² аÑгÑменÑ. Символ каÑеÑки (
^) не ÑаÑпознаеÑÑÑ ÐºÐ°Ðº escape-Ñимвол или ÑазделиÑелÑ. ÐнÑÑÑи заклÑÑенной в кавÑÑки ÑÑÑоки паÑа двойнÑÑ ÐºÐ°Ð²ÑÑек инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº одна ÑкÑаниÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка. ÐÑли ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ ÑÑÑока заканÑиваеÑÑÑ ÑанÑÑе, Ñем бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð° закÑÑваÑÑÐ°Ñ Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка, вÑе Ñже пÑоÑиÑаннÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð²ÑводÑÑÑÑ ÐºÐ°Ðº один поÑледний аÑгÑменÑ.Символ двойной кавÑÑки поÑле обÑаÑной коÑой ÑеÑÑÑ (
\") инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº лиÑеÑалÑнÑй Ñимвол двойной кавÑÑки (").Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑÑ ÑÑиÑаÑÑÑÑ Ð»Ð¸ÑеÑалами, еÑли ÑÑÐ°Ð·Ñ Ð·Ð° ними не ÑÑÐ¾Ð¸Ñ Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка.
ÐÑли Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка ÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ñле ÑеÑного ÑиÑла Ñимволов обÑаÑной коÑой ÑеÑÑÑ, в маÑÑив
\помеÑаеÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑÑ (argv) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ Ñимволов обÑаÑной коÑой ÑеÑÑÑ (\\), а Ñама Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка (") инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº ÑазделиÑÐµÐ»Ñ ÑÑÑок.ÐÑли Ð´Ð²Ð¾Ð¹Ð½Ð°Ñ ÐºÐ°Ð²ÑÑка ÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ñле неÑеÑного ÑиÑла Ñимволов обÑаÑной коÑой ÑеÑÑÑ, в маÑÑив
\помеÑаеÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¾Ð±ÑаÑной коÑой ÑеÑÑÑ (argv) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ Ñимволов обÑаÑной коÑой ÑеÑÑÑ (\\). Сам знак двойной кавÑÑки в ÑÑом ÑлÑÑае инÑеÑпÑеÑиÑÑеÑÑÑ ÐºÐ°Ðº escape-поÑледоваÑелÑноÑÑÑ Ð² ÑоÑеÑании Ñ Ð¿Ð¾Ñледним Ñимволом обÑаÑной коÑой ÑеÑÑÑ, Ñо еÑÑÑ Ð²"помеÑаеÑÑÑ Ð»Ð¸ÑеÑал двойной кавÑÑки (argv).
ÐÑÐ¸Ð¼ÐµÑ ÑинÑакÑиÑеÑкого анализа аÑгÑменÑов командной ÑÑÑоки
Ð ÑледÑÑÑем пÑимеÑе пÑогÑÐ°Ð¼Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð° пеÑедаÑа аÑгÑменÑов командной ÑÑÑоки:
// command_line_arguments.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( int argc, // Number of strings in array argv
char *argv[], // Array of command-line argument strings
char *envp[] ) // Array of environment variable strings
{
int count;
// Display each command-line argument.
cout << "\nCommand-line arguments:\n";
for( count = 0; count < argc; count++ )
cout << " argv[" << count << "] "
<< argv[count] << "\n";
}
РезÑлÑÑаÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° команднÑÑ ÑÑÑок
Ð ÑледÑÑÑей ÑаблиÑе Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð¿ÑимеÑÑ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸ ожидаемÑе вÑÑ Ð¾Ð´Ð½Ñе даннÑе, иллÑÑÑÑиÑÑÑÑие пÑименение пÑавил из пÑиведенного вÑÑе ÑпиÑка.
| ÐÑ Ð¾Ð´Ð½Ñе даннÑе в командной ÑÑÑоке | argv[1] | argv[2] | argv[3] |
|---|---|---|---|
"abc" d e |
abc |
d |
e |
a\\b d"e f"g h |
a\\b |
de fg |
h |
a\\\"b c d |
a\"b |
c |
d |
a\\\\"b c" d e |
a\\b c |
d |
e |
a"b"" c d |
ab" c d |
РазвеÑÑÑвание подÑÑановоÑнÑÑ Ð·Ð½Ð°ÐºÐ¾Ð²
ÐомпилÑÑÐ¾Ñ ÐайкÑоÑоÑÑ Ð¿Ñи необÑ
одимоÑÑи позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð´ÑÑановоÑнÑе знаки, вопÑоÑиÑелÑнÑй знак () и звездоÑÐºÑ (?*), ÑÑÐ¾Ð±Ñ ÑказаÑÑ Ð°ÑгÑменÑÑ Ð¸Ð¼ÐµÐ½Ð¸ Ñайла и пÑÑи в командной ÑÑÑоке.
ÐÑгÑменÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки обÑабаÑÑваÑÑÑÑ Ð²Ð½ÑÑÑенней подпÑогÑаммой в коде запÑÑка ÑÑÐµÐ´Ñ Ð²ÑполнениÑ, коÑоÑÑй по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ ÑаÑÑиÑÑÐµÑ Ð¿Ð¾Ð´ÑÑановоÑнÑе знаки в оÑделÑнÑе ÑÑÑоки в маÑÑиве argv ÑÑÑок. РаÑÑиÑение подÑÑановоÑнÑÑ
знаков можно вклÑÑиÑÑ, вклÑÑив setargv.obj Ñайл (wsetargv.obj Ñайл Ð´Ð»Ñ wmain) в /link паÑамеÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑа или LINK в командной ÑÑÑоке.
ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ паÑамеÑÑÐ°Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²Ñика Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка ÑÑÐµÐ´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñм. в ÑÑаÑÑе ÐаÑамеÑÑÑ ÑÑÑлок.
ÐаÑÑÑойка обÑабоÑки командной ÑÑÑоки C++
ÐÑли пÑогÑамма не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑменÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки, можно ÑоÑ
ÑаниÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑой обÑем пÑоÑÑÑанÑÑва, подавив подпÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð±ÑабоÑки командной ÑÑÑоки. ÐÐ»Ñ ÑÑого вклÑÑиÑе Ñайл noarg.obj (Ð´Ð»Ñ main и wmain) в паÑамеÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑа /link или команднÑÑ ÑÑÑÐ¾ÐºÑ LINK.
ÐналогиÑнÑм обÑазом, еÑли Ð²Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не иÑполÑзовали ÑаблиÑÑ ÑÑÐµÐ´Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к аÑгÑменÑÑ envp, можно подавиÑÑ Ð²Ð½ÑÑÑеннÑÑ Ð¿Ð¾Ð´Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð±ÑабоÑки ÑÑедÑ. ÐÐ»Ñ ÑÑого вклÑÑиÑе Ñайл noenv.obj (Ð´Ð»Ñ main и wmain) в паÑамеÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑа /link или команднÑÑ ÑÑÑÐ¾ÐºÑ LINK.
ÐÑогÑамма Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑ ÑемейÑÑво подпÑогÑамм spawn или exec в библиоÑеке ÑÑÐµÐ´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ C. Ð ÑÑом ÑлÑÑае не ÑледÑÐµÑ Ð¿Ð¾Ð´Ð°Ð²Ð»ÑÑÑ Ð¿Ð¾Ð´Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð±ÑабоÑки ÑÑедÑ, Ñак как она иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑедаÑи даннÑÑ
о ÑÑеде из ÑодиÑелÑÑкого пÑоÑеÑÑа в доÑеÑний.