| Заметки разработчика поисковых сервисов ( @ 2008-05-14 00:15:00 |
| 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() возвращают один и тот же указатель :-)