Ваш аргумент "безпеки" насправді не відповідає. Якщо ви не довіряєте користувачеві передавати вам рядок з нульовим завершенням, коли це те, що ви документували (і що є "нормою" для звичайного C), ви не можете дійсно довіряти довжині, яку вони надають вам (яку вони будуть ймовірно, використовуйте так strlen
само, як ви робите, якщо їм це не зручно, і що не вдасться, якщо "рядок" не був рядком в першу чергу).
Однак є вагомі причини вимагати довжини: якщо ви хочете, щоб ваші функції працювали над підрядками, можливо, набагато простіше (і ефективніше) пропустити довжину, ніж змусити користувача зробити якусь магію копіювання вперед і назад, щоб отримати нульовий байт в потрібному місці (і ризикуйте поодинці помилок по дорозі).
Уміння обробляти кодування, де нульові байти не є закінченнями, або вміти обробляти рядки, в які вбудовані нулі (за призначенням), може бути корисним за деяких обставин (залежить від того, що саме виконують ваші функції).
Здатність також обробляти дані, що не мають нульового завершення (масиви фіксованої довжини).
Коротше кажучи: залежить від того, що ви робите у своїй бібліотеці та якого типу даних ви очікуєте, що ваші користувачі будуть обробляти.
Можливо, також є аспект продуктивності цього. Якщо вашій функції потрібно заздалегідь знати довжину рядка, і ви очікуєте, що ваші користувачі, принаймні, як правило, вже знають, що інформація, передаючи їх (а не обчислюючи її), може погіршити кілька циклів.
Але якщо ваша бібліотека очікує звичайних простих текстових рядків ASCII, і у вас немає обмежувальних обмежень продуктивності та дуже хорошого розуміння того, як ваші користувачі будуть взаємодіяти з вашою бібліотекою, додавання параметра довжини не здається гарною ідеєю. Якщо рядок не завершено належним чином, шанси на те, що параметр довжини буде таким же неправдивим. Я не думаю, що ти з цим багато здобудеш.
CreateFile
приймаєLPTCSTR lpFileName
параметр як вхід. Довжина рядка від абонента не очікується. Насправді використання рядків, що закінчуються NUL, настільки вбудовані, що в документації навіть не згадується, що ім'я файлу повинно бути закінченим NUL (але, звичайно, повинно бути).