(K&R) По крайней мере первые 31 символ внутреннего имени имеют значение?
Если понимать буквально, это имеет смысл, но что именно означает быть значимым символом имени переменной?
Я начинающий ученик C, использующий K&R. Вот прямая цитата из книги:
"По крайней мере первые 31 символ внутреннего имени являются значимыми. Для имен функций и внешних переменных число может быть меньше 31, поскольку внешние имена могут использоваться ассемблерами и загрузчиками, над которыми язык не имеет никакого контроля. Для внешних имен Стандарт гарантирует только 6 символов и один регистр."
Кстати, что значит "единичный случай"?
5 ответов
Одиночный регистр обычно означает "нижний регистр". За исключением некоторых ОС, где это означает "верхний регистр". Дело в том, что смешанный случай не гарантированно работает.
abcdef
ABCDEF
отличаются только регистром. Это не гарантировано, чтобы работать.
Проблема "Значимость" - это одно из того, сколько букв может быть одинаковым.
Допустим, у нас есть только 6 значимых персонажей.
a_very_long_name
a_very_long_name_thats_too_similar
Выглядят по-разному, но первые 16 символов одинаковы. Поскольку только 6 значимы, это одна и та же переменная.
Это значит то, чего ты боишься. Для внешних имен стандарт C в то время K&R 2nd ed. был написан действительно дает только шесть символов без учета регистра! Так что вы не можете иметь afoobar
а также aFooBaz
как независимые лица.
Это абсурдное ограничение (которое должно было унаследовать устаревшие линкеры, давно ушедшие) больше не имеет отношения к какой-либо среде. Стандарт C99 предлагает 31 чувствительный к регистру символ для внешних имен и 63 для внутренних, а на практике часто используемые линкеры поддерживают гораздо более длинные имена.
Это просто означает, что если у вас есть две переменные с именем
abcdefghijklmnopqrstuvwxyz78901A
,
а также
abcdefghijklmnopqrstuvwxyz78901B
,
что нет гарантии, что они будут рассматриваться как разные, отдельные переменные...
Это означает, что:
foobar1
foobar2
может быть тем же внешним именем, потому что нужно учитывать только первые 6 символов. Один регистр означает, что имена в верхнем и нижнем регистре не должны различаться.
Обратите внимание, что почти все современные компоновщики будут рассматривать намного более длинные имена, хотя все еще будет ограничение, зависящее от компоновщика.
G'day,
Одна из проблем с этим ограниченным разрешением символов возникает во время соединения.
Несколько символов с одинаковым именем могут существовать в нескольких библиотеках, и редактор ссылок обычно берет только первый найденный символ, который соответствует тому, что он ищет.
Таким образом, используя приведенный выше пример S.Lott, если ваш редактор ссылок ищет символ "a_very_long_name" и находит в своем пути поиска библиотеку, содержащую символ "a_very_long_name_thats_too_s Similar", он примет это. Это произойдет, даже если в вашей команде была указана библиотека, содержащая нужный вам символ, то есть "a_very_long_name". Например, указав библиотеки как:
-L/my/library/path -lmy_wrong_lib -lmy_correct_lib
Теперь есть опции компилятора, или, точнее, опции времени компиляции, которые передаются в редактор ссылок, которые обеспечивают поиск нескольких символов в пути ссылки. Затем они обычно возникают как ошибки во время соединения.
Кроме того, многие компиляторы, например, gcc, будут использовать такое поведение по умолчанию. Вы должны явно включить несколько определений, чтобы редактор ссылок мог продолжить работу, не вызывая фатальной ошибки, если он находит несколько определений для символа.
Кстати, я очень рекомендую проработать упражнения вместе с книгой Кловиса Тондо "Книга ответов C, 2-е изд. ".
Делая это, вы действительно можете заставить C запомниться.
НТН
веселит,