Почему первые 31 символ идентификатора должны быть уникальными?

MISRA 2004 правило 5.1 гласит что все идентификаторы должны иметь уникальные первые 31 символ. В чем причина этого правила? Это техническое ограничение для некоторых компиляторов?


person Andreas    schedule 11.11.2013    source источник
comment
Раньше это было какое-то старое ограничение в некоторых очень старых компиляторах (и, возможно, в некоторых старых стандартах C). А на практике 31 символ вполне удобен   -  person Basile Starynkevitch    schedule 11.11.2013
comment
Это ограничение компоновщика, подробно обсуждаемое в [этом ответе Stackoverflow][1]. [1]: stackoverflow.com/a/18290577/53870   -  person Andy Dent    schedule 11.11.2013
comment
возможный дубликат Какова точная роль значимых символов в C (переменные)?   -  person unwind    schedule 11.11.2013


Ответы (2)


Стандарты C гарантируют только то, что определенное количество начальных символов в идентификаторах является значимым. Для C99 это 31 символ для внешних идентификаторов. Даже это огромный шаг вперед по сравнению с ANSI/IS C, который гарантирует только 6 значащих символов для внешних идентификаторов… (Так что, если вам интересно, почему так много старых функций C имеют непроизносимые имена, это одна из причин.)

На практике компиляторы, как правило, поддерживают большее количество значащих символов в идентификаторах (и в стандарте C IIRC даже есть сноска, поощряющая это), но MISRA, вероятно, хотел выбрать «безопасный» предел, уже гарантированный самым последним на тот момент стандартом C. , C99, без наложения ограничения в 6, которое было бы гарантировано C90, за которым в противном случае следует MISRA 2004.

редактировать: поскольку в комментариях дважды задавался вопрос, позвольте мне пояснить: MISRA 2004 не следует стандарту C99, и нет веских доказательств того, что стандарт C99 способствовал установлению MISRA лимита в 31 символ. Однако ограничение не исходит из C90 (ISO C), поскольку C90 указывает ограничение в 6 символов. Таким образом, нужно либо признать, что MISRA просто независимо выбрала номер 31 без какой-либо известной причины, либо (на мой взгляд, более вероятно) последовала примеру C99 в этом конкретном решении.

person Arkku    schedule 11.11.2013
comment
Наоборот, MISRA явно требует от компилятора большего, чем стандарт C — в этом цель правила. C99 не имеет значения для MISRA-C 2004. - person Lundin; 12.11.2013
comment
@Lundin Я говорил только в контексте этого конкретного ограничения, где MISRA не требует больше, чем C99 (самый последний стандарт C, установленный до MISRA 2004) — 31 символ — это произвольное ограничение, поэтому мой Есть предположение, что они взяли его из стандарта C99, чтобы максимизировать совместимость с современными компиляторами, избегая смехотворно строгой 6-символьной гарантии ANSI C. (Часть вставленного вами обоснования согласуется с этим предположением; они не упоминают C99, но число 31 почти наверняка взято оттуда, поскольку почти каждый компилятор поддерживает большее количество.) - person Arkku; 12.11.2013
comment
Этот вопрос касается MISRA-C:2004, который явно запрещает использование любого другого стандарта, кроме C90, поэтому, говоря о стандарте C вместе с MISRA 2004, вы всегда имеете в виду C90. (Для поддержки C99 вы должны использовать MISRA-C:2012, который является совершенно другим документом) - person Lundin; 12.11.2013
comment
@Lundin Я имел в виду только то, что я говорил о C99 в контексте моего ответа; не имеет значения, что MISRA указывает в другом месте. Но этот аргумент совершенно бессмыслен; Какой бы ни была причина выбора MISRA ограничения в 31 символ, это явно основано на том факте, что компиляторы, соответствующие стандартам, не обязаны поддерживать произвольное количество значащих символов в идентификаторах. В собственном обосновании MISRA не указывается, откуда они взяли 31, поэтому мое личное предположение состоит в том, что это из C99. Верно это предположение или нет, даже не имеет значения для ответа на вопрос. знак равно - person Arkku; 12.11.2013
comment
Arkku - как утверждает @Lundin, MISRA-C: 2004 указывает на соответствие только C90 (Правило 1.1). Ограничение в 31 символ происходит от C90. Любая ссылка на C99 неуместна при обсуждении MISRA-C:2004. - person Andrew; 13.11.2013
comment
@Andrew C90 указывает ограничение в 6 символов, а не в 31, поэтому это не имеет значения. В MISRA 2004 указан 31 символ, и спрашивающий хотел знать источник этого ограничения. Это явно не C90, и я предполагаю, что он выбран для соответствия C99 (потому что я не знаю ни одного компилятора с таким конкретным ограничением). Другая альтернатива заключается в том, что они просто выбрали номер независимо друг от друга. В любом случае, в контексте этого вопроса C90 не имеет значения, потому что он никак не способствует этому пределу (и, как показывает цитата Лундина, MISRA признает, что здесь он не следует C90). - person Arkku; 13.11.2013
comment
Для внешних он был установлен таким же, как и для внутренних (потому что это то, что делало большинство компиляторов в то время). Повторяю, С99 в него не заходит. - person Andrew; 15.11.2013
comment
[требуется ссылка] =) - person Arkku; 15.11.2013

MISRA-C:2004 следует стандарту C90, который требует, чтобы только 6 первых символов идентификатора рассматривались как отдельные. Вы можете прочитать обоснование в документе MISRA.

MISRA-C:2004 Правило 14:

Стандарт ISO требует, чтобы внешние идентификаторы различались по первым 6 символам. Однако соблюдение этого жесткого и бесполезного ограничения считается ненужным ограничением, поскольку большинство компиляторов/компоновщиков допускают значение не менее 31 символа (как для внутренних идентификаторов).

Упоминаемым стандартом ISO является ISO 9899:1990 (C90). Цель правила — убедиться, что вы используете нормальный, безопасный компилятор с достаточным количеством значимых символов.

person Lundin    schedule 12.11.2013