Максимальная длина идентификатора - PullRequest
10 голосов
/ 28 февраля 2010

Где найти максимальную длину идентификатора в C?

В каком заголовочном файле указан этот предел?

Ответы [ 4 ]

24 голосов
/ 28 февраля 2010

Нет заголовочного файла, который бы содержал ограничение длины идентификатора; даже если бы они были, как это могло бы вам помочь? Вы все равно не можете изменить длину идентификатора во время компиляции, основываясь на значении в заголовочном файле.

Стандарт C , раздел 5.2.4.1 гласит:

  • 63 значащих начальных символа во внутреннем идентификаторе или имени макроса (каждое универсальное имя или расширенный исходный символ считается одним символом)
  • 31 значащий начальный символ во внешнем идентификаторе (каждое имя универсального символа, указывающее короткий идентификатор 0000FFFF или менее, считается 6 символами, каждое имя универсального символа, указывающее короткий идентификатор 00010000 или более, считается 10 символами, и каждый расширенный источник символ считается таким же количеством символов, что и имя соответствующего универсального символа, если оно есть)

Он также содержит сноску:

Реализации должны по возможности избегать наложения фиксированных ограничений на перевод.

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

9 голосов
/ 28 февраля 2010

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

Когда-то вы могли полагаться только на 6 уникальных символов в моно-регистре для внешних переменных - потому что это было то, что обеспечивали некоторые среды мейнфреймов. (Это то, что сказано в стандарте C89, но отмечено, что ограничение было болезненным.)

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

3 голосов
/ 28 февраля 2010

Короче говоря, не существует никакого заголовочного файла, который бы сообщал вам об этом, что является частью спецификаций стандарта ANSI / ISO C, которые определяют структуру синтаксиса и механизма среды для самого языка C. В стандартах до C89 максимальная длина идентификатора составляла 6 из-за небольшого объема памяти и среды в таких системах, как мейнфреймы и системы * nix.

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

Другая причина заключается в том, что большинство компиляторов C ++ используют искажение имен в идентификаторах, что, как указал Джонатан Леффлер, может запутать компилятор, а также связь кода.

0 голосов
/ 14 января 2019

Поскольку в некоторых странных угловых случаях полезно, чтобы код знал об ограничении, вот метод, который можно поместить в (хотя и отвратительно) заголовочный файл:

#define SOMEREALLYREALLY...REALLYLONGNAME 1
#if SOMEREALLYREALLY
#define MAXIDENT 16
#elif SOMEREALLYREALLYR
#define MAXIDENT 17
#elif SOMEREALLYREALLYRE
#define MAXIDENT 18
...and so on

В конце концов, #ifs либо ударит усеченный идентификатор, либо полный идентификатор, если компилятор не усечет

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