Имена переменных K & RC - PullRequest
       1

Имена переменных K & RC

0 голосов
/ 28 февраля 2019

У меня есть некоторая путаница с содержанием имен переменных в K & R C. Оригинальный текст, как показано ниже:

По крайней мере, первые 31 символ внутреннего имени являются значащими.Для имен функций и внешних переменных число может быть меньше 31, потому что внешние имена могут использоваться ассемблерами и загрузчиками, над которыми язык не имеет никакого контроля.Для внешних имен стандарт гарантирует уникальность только для 6 символов и одного регистра.Ключевые слова, такие как if, else, int, float и т. Д., Зарезервированы: их нельзя использовать в качестве имен переменных.Они должны быть в нижнем регистре.Целесообразно выбирать имена переменных, которые связаны с назначением переменной и которые вряд ли будут перепутаны типографски.Мы склонны использовать короткие имена для локальных переменных, особенно индексы цикла, и более длинные имена для внешних переменных.

Что меня смутило, так это внешние имена, стандарт гарантирует уникальность только для 6 символов и одного регистра,Означает ли это, что для внешних имен допустимы только 6 ведущих символов, а все остальные символы игнорируются?Например, мы определили две внешние переменные myexvar1 и myexvar2, компилятор будет обрабатывать эти две переменные как одну?Если это правда, почему они советуют нам использовать более длинные имена для внешних переменных?

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Это наследие прошлого, которое больше не важно.Ни один компилятор сегодня не имеет таких ограничений, и это было то, что датируется временем, когда был создан старый unix.Причинами были (тогда и сегодня) ограничения, наложенные компилятором на имена в таблице символов (31), и ограничение, используемое компоновщиком (6) в то время.

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

0 голосов
/ 28 февраля 2019

По правде говоря, K & R довольно стар, поэтому я предполагаю, что с тех пор все изменилось.Я действительно не знаю причину, почему здесь дают ровно 6 символов:

Для внешних имен стандарт гарантирует уникальность только для 6 символов и одного регистра.

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

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

Компоновщики и динамические загрузчики все еще должны выполнять свою работу, чтобы собрать программу и запустить ее.По пути необходимо разрешить все неразрешенные символы, чтобы они выполняли текстовый поиск этих символов в объектных файлах.Линкеры и загрузчики не являются компилятором.Возможно, у них есть свои правила обращения с этими именами (наверное, еще во времена K & R).Вот что это ...

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

... примерно.

В наши дни все ваши проблемы с K & R кажутся устаревшими и неактуальными.Выберите новый стандарт для подражания.

0 голосов
/ 28 февраля 2019

Это связано с историческим прошлым, касающимся длины экспортируемых символов для компоновщика системы.

Я цитирую Новый стандарт С - экономический и культурный комментарий .

Значения 6 и 10 были выбраны так, чтобы кодировки \ u1234и \ U12345678 можно использовать.

Значительное ограничение на число символов в Фортране, равное шести, долгое время соблюдалось многими поставщиками линкеров.Необходимость в более длинных идентификаторах для поддержки искажения имен в C ++ гарантировала, что большинство современных компоновщиков поддерживают гораздо более значимые символы во внешнем идентификаторе.

Общие реализации

Исторически количество значащих символов во внешнем идентификатореИдентификатор определялся поведением компоновщика, предоставленного поставщиком хоста.Только после успеха MS-DOS разработчики привыкли к поставщикам переводчиков, предоставляющим свой собственный компоновщик.Ранее большинство компоновщиков поставлялось поставщиком оборудования.Мир мэйнфреймов, как правило, определялся требованиями Fortran, который имел шесть значащих символов во внутреннем или внешнем идентификаторе.В этой среде не всегда было возможно заменить системный компоновщик одним, поддерживающим более значимые символы.Важность среды мэйнфреймов уменьшилась в 1990-х годах.В современных средах очень часто можно получить альтернативные компоновщики.

Таким образом, основная проблема заключалась в возможности связать воедино библиотеки, скомпилированные в C, с библиотеками, скомпилированными в Fortran, и Fortran установил ограничение 6.

Подробнее читайте по данной ссылке.

0 голосов
/ 28 февраля 2019

Означает ли это, что для внешних имен допустимы только 6 ведущих символов, а все остальные символы игнорируются?Например, мы определили две внешние переменные myexvar1 и myexvar2, компилятор будет обрабатывать эти две переменные как одну?

Да, это было так в 1990 году. Вернее, 6 уникальных ведущих символов внешних идентификаторов были тем, что стандарт C90 установил как минимум ограничение для компилятора.Это, конечно, было безумием - именно поэтому этот предел был увеличен до 31 в C99.

На практике большинство компиляторов C90 имели как минимум 31 уникальный символ для внутренних и внешних идентификаторов.


Если это правда, почему они советуют нам использовать более длинные имена для внешних переменных?

Не уверен, что они советуют это.Но стиль кодирования, используемый в K & R, часто просто ужасен, так что это определенно не та книга, к которой следует обращаться за советом по стилю кодирования.


В современном C требуется (C17 5.2.4.1), чтоу нас есть:

63 значимых начальных символа во внутреннем идентификаторе или имени макроса

31 значимых начальных символов во внешнем идентификаторе

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

Как указано в другом ответе, даже ограничение в 31 значимое начальное число для внешних идентификаторов указано как устаревшее, что означает, что это может привести кувеличилось еще больше, до 255, в будущих стандартах.

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