Заметки разработчика поисковых сервисов ([info]itman) wrote,
@ 2008-05-14 00:15:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:c++, fun, programming

Если константа сопротивляется, тем хуже для константы
С удивлением обнаружил один довольно распространенный анти-паттерн использования функции strtok_r.


string buf = "this is a simple test";

char d[2] = {some_char, 0};
char *pLast, *p;
for(char *pStart = (char *)buf.c_str();p = strtok_r(pStart, d, &pLast);pStart = NULL) {
....
}

Великий и могучий сопротивляется как может, не позволяя просто так преобразовать константный указатель в неконстантный, но программист оказывается упорнее. С улыбкой на лице он берет молоток потяжелее и смело забивает шуруп.
Что самое смешное, довольно сложно найти реализацию строки, для которой приведенный код не будет работать. Разумеется, при условии, что программист использует строку buf только в качестве одноразового буфера и не беспокоится по поводу нулей, неожиданно образовавшихся в ней после вызовов strtok_r.
PS: функция strtok_r модифицирует буфер
PPS: Очевидно, в целях оптимизации строка чаще всего хранится в виде массива, последний элемент которого равен нулю. Именно поэтому, вышеприведенный код работает на большинстве платформ, а функции data() и c_str() возвращают один и тот же указатель :-)



(Post a new comment)


[info]alexott
2008-05-14 06:44 am UTC (link)
а почему не используются более высокоуровневые функции? такой стиль меня всегда раздражал - ужасающая смесь C++ и C...

(Reply to this)(Thread)


[info]itman
2008-05-14 01:50 pm UTC (link)
Это, скорее всего, древняя традиция :-)

(Reply to this)(Parent)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…