Строковые методы в стандартной библиотеке имеют определенную семантику. Если кто-то генерирует массив char
, который содержит различные значения, и передает указатель на массив или его часть, методы, поведение которых определяется в терминах байтов NUL, должны искать байты NUL таким же образом, как это определено стандартом.
Можно определить свои собственные методы для обработки строк, которые используют лучшую форму хранения строк, и просто сделать вид, что стандартных библиотечных функций, связанных со строками, не существует, если только не нужно передавать строки таким вещам, как fopen
. Самая большая трудность при таком подходе заключается в том, что если не используются непереносимые функции компилятора, невозможно использовать встроенные строковые литералы. Вместо того, чтобы сказать:
ns_output(my_file, "This is a test"); // ns -- new string
нужно было бы сказать что-то более похожее на:
MAKE_NEW_STRING(this_is_a_test, "This is a test");
ns_output(my_file, this_is_a_test);
где макрос MAKE_NEW_STRING
создаст объединение анонимного типа, определит экземпляр с именем this_is_a_test
и соответствующим образом инициализирует его. Поскольку многие строки будут иметь разные анонимные типы, проверка типов потребует, чтобы строки были объединениями, включающими элемент известного типа массива, а коду, ожидающему строки, должен быть предоставлен указатель на этот элемент, вероятно, с использованием чего-то вроде:
#define ns_output(f,s) (ns_output_func((f),(s).stringref))
Можно было бы определить типы таким образом, чтобы избежать необходимости в члене stringref
и чтобы код просто принимал void*
, но член stringref по существу выполнял бы статическую утиную типизацию (только вещи с членом stringref
могли быть переданы в такой макрос) и может также разрешить проверку типа самого типа stringref
).
Если бы можно было принять эти ограничения, я думаю, можно было бы написать код, который был бы более эффективным почти во всех отношениях, чем строки с завершающим нулем; вопрос будет заключаться в том, будут ли преимущества стоить хлопот.
person
supercat
schedule
26.05.2015
'\0'
-терминированныеchar
массивы. У них даже есть около 5 тегов SO, посвященных им =) - person Mints97   schedule 26.05.2015\0
, - это просто соглашение. Если вы хотите использовать функцииstr*
, ваш массив символов должен следовать этому соглашению. Но никто не мешает вам создать свой собственный набор функций, который следует другой парадигме. - person RedX   schedule 26.05.2015