Нужен аналог вот этого https://github.com/hasherezade/paramkit , но на чистом Си (С99), и желательно без CRT. Чтобы была корректная обработка строковых параметров (кавычки, пробелы, вот это все).
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw - ну а дальше сам, раз уж плюсов боишься, как огня.
f13nd, нужна проверка на недопустимый аргумент, и т.д. Лень самому кодить, может у кого есть готовое. Rel, проект на Си, зачем мне там плюсы.
Вот, выдрал из моего шаблона С++, вроде вполне чистый C Код (C): wchar_t* GetCmdLineParam(wchar_t* CmdLine, wchar_t* Param, unsigned short Scope='\"\"', PUINT ParLen=NULL) { char SFchB = Scope >> 8; char SFchE = Scope; while(*CmdLine && (*CmdLine <= 0x20))CmdLine++; // Skip any spaces before if(*CmdLine == SFchB)CmdLine++; // Skip opening quote else SFchE = 0x20; // No quotes, scan until a first space T ParBeg = CmdLine; if(Param) { UINT MaxLen = (ParLen)?(*ParLen):(-1); // -1 is MaxUINT while(*CmdLine && (*CmdLine != SFchE) && MaxLen--)*(Param++) = *(CmdLine++); *Param = 0; } else {while(*CmdLine && (*CmdLine != SFchE))CmdLine++;} if(ParLen)*ParLen = CmdLine - ParBeg; // In Chars if(*CmdLine)CmdLine++; // Skip last Quote or Space // while(*CmdLine && (*CmdLine <= 0x20))CmdLine++; // Skip any spaces after return CmdLine; } Вот так это использую: Код (C): PWSTR CmdLine = GetCommandLineW(); CmdLine = GetCmdLineParam(CmdLine, PWSTR(0)); // Skip EXE file name and path int ParCnt = -1; wchar_t Cmd[64]; wchar_t Arg[MAX_PATH]; for(;*CmdLine;ParCnt++) { CmdLine = GetCmdLineParam(CmdLine, Cmd); if(!lstrcmpi(L"-L", Cmd)) { CmdLine = GetCmdLineParam(CmdLine, Arg); if(!AssignFilePath(ListFile, StartUpDir, Arg)){break;} continue; } if(!lstrcmpi(L"-S", Cmd)) { CmdLine = GetCmdLineParam(CmdLine, Arg); Step = DecStrToNum(Arg); continue; } } Что-то более развитое наверняка потащит за собой CRT
Vicshann, спасибо, попробую. Что значит "T ParBeg = CmdLine;" ? Это шаблон какой-то, как это будет в Си?
это значит copy-initialization with scalar initializer (prvalue), copy-elision semantics applied for the CTOR event. --- Сообщение объединено, 21 ноя 2020 --- а в си это будет alloc(), memcpy(), CTOR() // then use --- Сообщение объединено, 21 ноя 2020 --- если полиморфный класс надумал копировать, то данные в нём располагаются в порядке (void**pVFT, int a int b, c ну итд) --- Сообщение объединено, 21 ноя 2020 --- точнее говоря наврал я несколько - важно не scalar/aggregate, а то к какой категории значений(lvalue/prvalue/xvalue) относится инициализирующее выражение - тут и работает семантика копирования/оптимизации копии/перемещения. --- Сообщение объединено, 21 ноя 2020 --- значёк поинтера относится к декларатору, а не к базовому типу, прекращайте уже путать void* pSrc и void *pSrc; - это одно и тоже, хз кто так ддумался писать - но явно не тот кто матчасть изучал.
Это дело привычки. Стараюсь не объявлять несколько переменных в одной строке. Если это учесть, то запись является лучше читаемой(как минимум для меня). Ибо тип и переменная разделены пробелом. Почти всегда работаю над проектами один. Так что это не столь важно. Но в любом случае, спасибо за совет. http://www.kurzenkov.com/software_development/asterisk.html
это не дело привычки - есть вполне себе описанная технически тема - declaration statement, доступна например вот тут: https://en.cppreference.com/w/cpp/language/declarations
Я кстати тоже всегда uint32_t* ptr пишу или использую auto, там где это возможно. Это куда лучше читается.
Так никто и не спорит, что это все есть описано. Я так пишу код, ибо мне так удобнее/читабельнее. А не потому, что я не знаю как нужно правильно. P.S. Менять свою привычку пока не собираюсь. Спасибо!