MISRA 2004 правило 5.1 утверждает, что все идентификаторы должны иметь первые 31 символа. В чем причина этого правила? Это техническое ограничение с некоторыми компиляторами?Почему первые 31 символа идентификатора должны быть уникальными?
ответ
Стандарты C гарантируют, что определенное количество начальных символов в идентификаторах является значительным. Для C99 это 31 символ для внешних идентификаторов. Даже это огромный шаг от ANSI/IS C, который гарантирует только 6 значащих символов для внешних идентификаторов ... (Итак, если вам интересно, почему у многих старых функций C есть непроизносимые имена, это одна из причин.)
На практике компиляторы, как правило, поддерживают большее число значимых символов в идентификаторах (и стандарт IIRC на C даже имеет сноску, способствующую этому), но MISRA, вероятно, хотела бы выбрать «безопасный» лимит, уже гарантированный тогдашним самым последним стандартом C , C99, не налагая предел 6, который был бы гарантирован C90, который MISRA 2004 в противном случае следует.
редактировать: Так как она была поставлена под сомнение дважды в комментариях, позвольте мне уточнить: MISRA 2004 не следует C99, и нет никаких убедительных доказательств того, что стандарт C99 способствовал выбранному пределу Мишров специфично 31 символов. Однако предел не происходит от C90 (ISO C), потому что C90 указывает предел в 6 символов. Таким образом, нужно либо принять, что MISRA просто выбрал номер 31 независимо, без какой-либо известной причины, или (по моему мнению, скорее) следовал примеру C99 в этом конкретном решении.
Напротив, MISRA явно требует больше от компилятора, чем стандарт C - это цель править. C99 не имеет отношения к MISRA-C 2004. – Lundin
@ Lundin Я говорил только в контексте этого конкретного ограничения, где MISRA не требует больше, чем C99 (самый последний стандарт C, установленный до MISRA 2004) - 31 символ - произвольный предел , поэтому я предполагаю, что они взяли его из стандарта C99, чтобы максимально совместиться с современными компиляторами, избегая при этом смехотворно строгой 6-символьной гарантии ANSI C.(Часть обоснования, которое вы вставили, согласуется с этим предположением: они не упоминают C99, но число 31 почти наверняка происходит оттуда, так как почти каждый компилятор поддерживает больше.) – Arkku
Этот вопрос касается MISRA-C: 2004, который явно запрещает использование любого другого стандарта, кроме C90, поэтому, говоря о «стандарте C» вместе с MISRA 2004, вы всегда имеете в виду C90. (Для поддержки C99 вы использовали бы MISRA-C: 2012, который является совсем другим документом) – Lundin
MISRA-C: 2004 следует стандарту C90, который требует только 6 первых символов идентификатора для обработки как отдельных. Вы можете прочитать обоснование в документе MISRA.
МИСРА-С: 2004 Правило 14:
Стандарт ИСО требует внешних идентификаторов быть различными в первых 6 символов. Однако соблюдение этого строгого и бесполезного ограничения считается ненужным ограничением, поскольку большинство компиляторов/компоновщиков допускают не менее 31 символа (как для внутренних идентификаторов).
Стандарт ИСО, обозначенный как ISO 9899: 1990 (C90). Целью этого правила является обеспечение использования разумного, безопасного компилятора с достаточным количеством символов.
Раньше это было какое-то давнее ограничение в некоторых очень старых компиляторах (и, возможно, некоторых старых стандартах C). И на практике 31 символ достаточно удобен –
Это ограничение линкера, подробно обсуждаемое в [this Stackoverflow Answer] [1]. [1]: http://stackoverflow.com/a/18290577/53870 –
возможно дубликат [Что точная роль "значимых символов" в C (переменных)?] (HTTP: // StackOverflow .com/questions/18290165/whats-the-exact-role-of-significant-characters-in-c-variables) – unwind