2013-04-15 2 views
3

This сайт говорит, что «Не указывайте похожие имена своим переменным. Например, компилятор может предположить, что forgiveme и forgivemenot являются одной и той же переменной. Если это так, может возникнуть уродливая ситуация».В C, когда имена «простите» и «прощение» относятся к одной и той же переменной?

Я никогда не читал об этой проблеме в переменных именах. Когда произойдет такая уродливая ситуация? И что они означают, говоря, что компилятор может предположить, что они не являются одной и той же переменной?

+0

Не уверен, что я буду доверять советам из какого-то источника, который включает в себя слово «чайники»;) – jpw

+0

@jpw Это для чайников, не обязательно с помощью манекенов. –

ответ

9

Имена должны быть уникальными в своих первых 31 символов

§5.2.4.1 пределы перевода стандарта C11 говорит

Реализация должна быть в состоянии перевести и выполнить по крайней мере одну программу, которая содержит по крайней мере, один экземпляр каждого из следующих ограничений: 18)

- 31 знаковых начальных символа в внешнем идентификаторе (каждое универсальное имя символа sp выравнивание короткого идентификатора 0000FFFF или менее считается 6 символами, каждый 18) Реализации должны избегать введения фиксированных ограничений перевода, когда возможно .

Тот же предел применяется для C99, поэтому имена ваших примеров должны быть однозначно идентифицированы любым совместимым с требованиями компилятором за последние 10 лет.

+0

Существуют стандарты, а затем есть реальный мир, в котором все живут, где им иногда приходится работать с системами, которые не придерживаются последний самый большой стандарт. Хотя стандарт, безусловно, верен, остается, что ** есть ** компиляторы там, где важна длина имени переменной. Это единственное предостережение, которое я бы добавил ... для всех практических целей, согласно стандарту, длина имени переменной не должна быть проблемой ... однако есть исключения, о которых следует знать. –

+0

Я не сомневаюсь, что там есть несоответствующие компиляторы. У вас есть какие-то конкретные примеры? – simonc

+0

Я не делал вложенных материалов довольно долго, но я не видел недостатка в нарушениях стандартов в компиляторах для микроконтроллеров/встроенных систем на протяжении многих лет. Я не призываю в частности, но это место, где чаще всего видят «свободы». –

4

Было время, очень давно, когда максимальная длина символа составляла восемь символов. Вы можете использовать символ длиннее восьми, но только первые восемь были значительными.

Это время прошло где-то в 80-х годах.

+0

В 7-м выпуске UNIX ™ (1978) компилятор C был ограничен: _2.2 Идентификаторы (имена) Идентификатор представляет собой последовательность букв и цифр; первый символ должен быть буквенным. Подчеркнутый символ '_' подсчитывает как алфавит. Буквы верхнего и нижнего регистра считаются разными. Не более, чем первые восемь символов являются значительными, и только первые семь для внешних идентификаторов. –

3

Было время, и были (есть) компиляторы, ограничивающие длину имени переменной. Если, например, компилятор в вопросе допускает только имена переменных 8 символов, то на самом деле это было бы проблемой, как forgiveme и forgivemenot будет та же переменная forgivem

Однако, большинство современных компиляторов это не проблема , Если вы работаете с тайным компилятором или небольшим встроенным системным компилятором, который имеет проблемы с длиной имени переменной, это может быть проблемой.

5

С (с 1999 г.) стандарт говорит в 5.2.4.1 Translation limits:

Реализация должна быть в состоянии перевести и выполнить хотя бы одну программу, которая содержит по меньшей мере один экземпляр каждого из следующих ограничений:
- 31 значительные начальные символы во внешнем идентификатору ...

А потом в 6.4.2 Identifiers/6.4.2.1 General:

Как описано в 5.2.4.1, реализация может ограничить количество значительных начальных символов в идентификаторе; ...

Любые идентификаторы, отличающиеся значительным символом, являются разными идентификаторами. Если два идентификатора отличаются только несущественными символами, поведение не определено.

Так, forgiveme и forgivemenot рассматриваются так же, если есть меньше 10 значимые символы, поддерживаемые является хорошим неопределенным поведение.

31 - это то, что раньше было 6 в стандарте C от 1989 года (AKA ANSI C).

Смежные вопросы