2011-05-15 9 views
25

Я не помню стандарт, говорящий о максимальной длине для идентификаторов, поэтому в теории они могут быть long. В реальной жизни эти имена могут быть ограничены, по крайней мере, реализацией компилятора и компоновщика.Какова максимальная длина идентификатора C/C++ в общих (сборных) системах?

В то время как это должно работать на всех системах

int a; 

этот фрагмент

#!/usr/bin/perl 
print "int" . "b" x 2**16 . ";"; 

создает declarationen, что дает неопределенная ссылка на std:: нечто с ld при компиляции/связывания (с использованием GCC/MinGW).

Так каковы пределы размера для идентификатора на разных системах?

+1

Имейте в виду, что ограничения длины имени являются для * искореженных имен *. Я был избит много раз некоторыми раздражающими предупреждениями от MSVC, когда я писал функции шаблона и передавал им некоторый 'boost :: transform_iterator '. Извращенное имя экземпляра становится просто безумно длинным. –

+0

@Alexandre: До сих пор у меня никогда не было этой проблемы. Единственная проблема, связанная с шаблонами, которые я помню, заключалась в том, что мне пришлось увеличить глубину шаблона в некоторых проектах, которые использовали метапрограммирование. – mbx

+0

gcc не имеет такой проблемы (см. Ответ @Anders). Это только предупреждение, которое иногда случается с инструментами MS, когда искаженные имена превышают 2048 символов. Однако, как правило, он не играет хаос со своими сборками. –

ответ

12

Приложение B стандарта C++ говорит, что реализация должна поддерживать идентификаторы длиной не менее 1024 символов, но это необязательно.

+2

Одно слово осторожно, эта длина идентифицирует искаженный символ, если память служит мне правильной. Функция, принимающая шаблонные классы в качестве аргументов, может получить довольно волосатые искаженные имена, поэтому предел пока не набирается. –

+0

@Matthieu Не очевидно. На самом деле, насколько мне известно, в стандарте не обсуждается изменение имени. –

+0

@Neil: Я не думаю, что это так, каждый компилятор может (и на самом деле должен) разработать свой собственный ABI (или, если повторно использовать чье-то другое, убедитесь, что код действительно совместим). Я просто хотел поднять тот факт, что стандарт определяет длину для цепочки инструментов, но это отличается от длины, указанной на компоновщике, поскольку линкер видит только искаженные (украшенные) символы. –

Смежные вопросы