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

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

Если вы действительно должны иметь взаимный импорт в Python, способ сделать это - импортировать их внутри функции:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

Теперь a.py может безопасно выполнять import b, не вызывая проблем.

(На первый взгляд может показаться, что cause_a_to_do_something() будет чрезвычайно неэффективным, поскольку он выполняет import каждый раз, когда вы его вызываете, но на самом деле импортная работа выполняется только в первый раз. Второй и последующий раз, когда вы импортируете модуль, это быстрая операция.)

14
задан gwg 19 April 2016 в 01:17
поделиться

5 ответов

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

abcdef

ABCDEF

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

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

Допустим, у нас всего 6 значащих символов.

a_very_long_name

a_very_long_name_thats_too_similar

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

19
ответ дан 1 December 2019 в 09:13
поделиться

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

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

.
5
ответ дан 1 December 2019 в 09:13
поделиться

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

abcdefghijklmnopqrstuvwxyz78901A,

и

abcdefghijklmnopqrstuvwxyz78901B,

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

3
ответ дан 1 December 2019 в 09:13
поделиться

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

foobar1
foobar2

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

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

.
2
ответ дан 1 December 2019 в 09:13
поделиться

G'day,

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

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

Итак, используя пример С.Лотта сверху, если ваш редактор ссылок ищет символ "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, будут по умолчанию использовать такое поведение. Вы должны явно включить несколько определений, чтобы редактор ссылок мог продолжить работу, не поднимая фатальную ошибку, если он найдет несколько определений для символа.

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

Это действительно поможет заставить C зациклиться на вашем сознании.

HTH

cheers,

.
0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: