Подтвердить что ты не робот

(K & R) По крайней мере, первые 31 символа внутреннего имени значительны?

Если взять буквально, это имеет смысл, но что именно означает быть значимым символом имени переменной?

Я начинаю ученик C, используя K & R. Вот прямая цитата из книги:

"По крайней мере, первые 31 символа внутреннего имени значительны. Для имен функций и внешних переменных число может быть меньше 31, поскольку внешние имена могут использоваться ассемблерами и загрузчиками, над которыми язык не имеет контроля. Для внешних имен стандарт гарантирует только 6 символов и один случай."

Кстати, что означает "единичный случай"?
4b9b3361

Ответ 1

Один случай обычно означает "нижний регистр". За исключением некоторых ОС, где это означает "верхний регистр". Дело в том, что смешанный случай не гарантированно работает.

abcdef

ABCDEF

отличаются только в случае. Это не гарантируется.

Проблема "Значение" - это одно из того, сколько букв может быть одинаковым.

Скажем, у нас есть только 6 значимых символов.

a_very_long_name

a_very_long_name_thats_too_similar

Посмотрите другое, но первые 16 символов совпадают. Поскольку только 6 значительны, это одна и та же переменная.

Ответ 2

Это означает, что вы боитесь, что это означает. Для внешних имен стандарт C в момент времени K & R 2nd ed. было написано, что действительно дает только шесть нечувствительных к регистру символов! Таким образом, вы не можете иметь afoobar и aFooBaz как независимые объекты.

Это абсурдное ограничение (которое предназначалось для размещения устаревших линкеров, которые сейчас давно исчезли) больше не относится к какой-либо среде. Стандарт C99 предлагает 31 чувствительный к регистру символов для внешних имен и 63 внутри, а обычно используемые компоновщики на практике поддерживают гораздо более длинные имена.

Ответ 3

Это просто означает, что если у вас есть две переменные с именем

abcdefghijklmnopqrstuvwxyz78901A,

и

abcdefghijklmnopqrstuvwxyz78901B,

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

Ответ 4

Это означает, что:

foobar1
foobar2

может быть одним и тем же внешним именем, поскольку необходимо учитывать только первые 6 символов. Единственный случай означает, что имена верхнего и нижнего регистров не должны различаться.

Обратите внимание, что почти все современные линкеры будут рассматривать гораздо более длинные имена, но все равно будет предел, зависящий от компоновщика.

Ответ 5

G'day,

Одна из проблем с этим ограниченным разрешением символа происходит во время соединения.

Несколько символов с тем же именем могут существовать в нескольких библиотеках, и редактор ссылок обычно принимает только первый найденный, который соответствует тому, что он ищет.

Итак, используя вышеприведенный пример S.Lott, если ваш редактор ссылок ищет символ "a_very_long_name" и находит библиотеку на пути поиска, которая содержит символ "a_very_long_name_thats_too_similar", это займет это. Это произойдет, даже если в вашей команде указана библиотека, содержащая нужный вам символ, то есть "a_very_long_name". Например, указывая библиотеки как:

-L/my/library/path -lmy_wrong_lib -lmy_correct_lib

Теперь есть параметры компилятора или более правильно компилировать параметры времени, которые передаются редактору ссылок, которые обеспечивают поиск нескольких символов в вашем пути ссылки. Затем они обычно возникают как ошибки во время соединения.

Кроме того, многие компиляторы, например. gcc, по умолчанию будет работать. Вы должны явно включить несколько определений, чтобы разрешить редактор ссылок, не поднимая фатальную ошибку, если он находит несколько определений для символа.

Кстати, я очень рекомендую работать с упражнениями в сочетании с книгой Кловиса Тондо "" C Answer Book 2nd ed.".

Выполнение этого действительно помогает сделать C палку в вашем уме.

НТН

веселит,