Вопрос
Есть ли способ получить максимальный размер любой строки, коррелированной с errno
во время компиляции (при препроцессорном времени будет еще лучше)? Например. верхняя граница на strlen(strerror(errno))
?
Мои мысли
Самое лучшее, о чем я могу думать, это запустить программу для поиска грубой силы по диапазону int по каждой локали, чтобы получить строку, связанную с каждой парой {errno, locale}, получить ее размер и создать заголовок в этой системе, а затем подключить его к примеру make файл или autoconf или что-то еще. Я не могу придумать лучшего способа сделать это, но кажется смешным, что это будет так: стандартная библиотека для системы имеет встроенную информацию, если только неявно. Неужели нет хорошего способа получить эту информацию?
Хорошо, я признаю, что стандарты C и/или С++ могут разрешать для строк ошибок, сгенерированных во время выполнения, например, (например, strerror(EINVAL)
, давая строку, полученную из других метаданных времени выполнения, установленных при последнем наборе errno
или что-то в этом роде) - не уверен, что это разрешено, и я действительно приветствовал бы такую реализацию, но Я никогда не слышал об одном существующем, который сделал это, или имел более одной строки для данной пары {errno
, locale}.
Мотивация
В контексте, что я специально хотел (но я думаю, что этот вопрос ценен более общим образом, как обсуждалось в комментариях), что привело к тому, что этот вопрос состоял в том, чтобы использовать строку ошибок, связанную с errno
в syscall/function writev
. В моем конкретном usecase я использовал обе строки из argv
и errno
-связанных строк. Это установило мою "наихудшую" длину до ARG_MAX
+ some max errno string length
+ size of a few other small errors
).
Каждый документ * nix, с которым я консультировался, по-видимому, указывает, что writev
будет (или "может" ), за то, что мало что может сделать в этом случае) ошибка с errno
установлена на EINVAL
, если сумма значения iov_len
переполняются SSIZE_MAX
. Интуитивно я знаю, что каждая строка errno
, которую я видел, очень короткая, и на практике это не проблема. Но я не хочу, чтобы мой код таинственным образом не выдавал ошибку на какой-либо системе, если это предположение было ложным. Поэтому я написал код для обработки такого случая - но в то же время я не хочу, чтобы этот дополнительный код был скомпилирован для платформ, которые, как правило, явно не нуждаются в нем.
Комбинированный ввод ответов и комментариев до сих пор заставляет меня наклониться к мысли, что в моем конкретном случае использования "правильное" решение состоит в том, чтобы просто обрезать неприлично длинные сообщения, но именно поэтому я задал вопрос, как я изначально: такая информация также помогла бы выбрать размер для буфера strerror_r
/strerror_s
(* nix/Windows соответственно), и даже отрицательный ответ (например, "вы не можете этого сделать" ) находится в моем вид полезен для обучения других людей.
Похожие
Этот вопрос содержит ответы на строки, указанные strerror_r
на VxWorks, но я не чувствую себя комфортно, обобщая это для всех систем.