Здравствуйте, Pavel Dvorkin, Вы писали:
GZ>>strok — злобная функция, так как она использует static данные на уровне CRT.
PD>Хуже. Она использует __declspec(thread). Иначе, сам подумай, что будет, если ее начнут из разных потоков вызывать
Для этого достаточно одного потока.
PD>Во многих и даже очень многих могу
PD>const char* p — и я имею право предположить, что не будет.
+1. К сожалению const многие не ставят. Поэтому приходится лазить по коду и узнавать, можно или нельзя.
Ну а в Net const в параметрах нет.
GZ>>По крайней мере одну придется делать(и не дай бог что TestWord тоже использует strtok):
GZ>>GZ>>void MyWords(const char* str)
GZ>>{
GZ>> char* myString=new char[strlen(str)+1];
GZ>> strcpy(myString, str);
GZ>> p=strtok(myString,",");
GZ>> while(p)
GZ>> {
GZ>> TestWord(p);
GZ>> p = strtok(NULL,",")
GZ>> }
GZ>>}
GZ>>
PD>Да зачем же ? Пусть TestWord себе благополучно эту строку исследует (например, является ли слово палиндромом). Начало — p, конец — '\0', зачем мне тут подстроки в отдельный буфер копировать, когда и на месте все ясно ?
Честно говоря, аналогом можно считать больше wstring чем char*. Char* — это область памяти с которой можно сильно сглюкавить, что для Net противозаконно. Я когда код пишу, подразумеваю что им будут пользоваться и другие. А другие обычно в код функции не смотрят, а ориентируются по названию и параметрам. Поэтому всегда пытаюсь показать, что строка может быть изменена или нет, тем же const. Но бывает и такое:
if (bla-bla)
strupr(lpStr);
То есть, не обязательно строка будет изменена. А защищать ее как-то уже надо. В Net над таким задумываться не надо. Поскольку это не value объект, он всегда передается по ссылке. А возвращаться может только в виде другой строки(или другой ссылки, если строка не изменилась). Именно в том, что это именно неvalue объект, и не хранится в стеке, скорее и стало определяющим фактом для выбора такого "функционального" пути.
Но особым плюсом такого подхода можно указать следующее:
string str1="this is the string";
.......
string str2="this is the string";
Строка str1 и str2 — несмотря на то, что являются разными ссылками, в действительности ссылаются на одну и ту же строку. Строка лежит в метаданных. Достаточно частый случай что константно описывают одну и ту же строку в разных частях программы. Компилятор сохраняет строку в одном и том-же месте.
С уважением, Gleb.