Максимальное количество параметров в объявлении функции - PullRequest
27 голосов
/ 03 января 2011

Я знаю, что минимальное количество параметров в определении функции равно нулю, но каково максимальное количество параметров в определении функции?Я задаю вопрос только ради знания и из любопытства, а не для того, чтобы написать настоящую функцию.

Ответы [ 4 ]

43 голосов
/ 03 января 2011

Да, существуют ограничения, накладываемые реализацией. Ваш ответ дан жирным шрифтом в следующей выдержке из стандарта C ++.

1. Язык С ++


Приложение B - Количество реализации

  1. Поскольку компьютеры конечны, реализации C ++ неизбежно ограничены в размере программ они могут успешно обработать. Каждый реализация должна документировать те ограничения там, где это известно. Это документация может ссылаться на фиксированные ограничения где они существуют, скажи, как вычислить переменные пределы как функция доступные ресурсы, или сказать, что исправлено пределы не существуют или неизвестны.

  2. Пределы могут ограничивать количества, которые включают те, которые описаны ниже другие. число в скобках после каждое количество рекомендуется в качестве минимум для этого количества. Однако, эти величины являются лишь ориентировочными и не определить соответствие.
    - Уровни вложенности составных операторов, структуры управления итерациями и выбор структур управления [256].
    - Уровни вложенности условного включение [256].
    - Указатель, массив и объявления функций (в любом комбинация) изменение арифметики, структура, объединение или неполный тип в объявлении [256].
    - Вложенность уровни выражений в скобках в полном выражении [256].
    - Количество символов во внутреннем идентификатор или имя макроса [1 024].
    - Количество символов во внешнем идентификатор [1 024].
    - Внешний идентификаторы в одной единице перевода [65 536].
    - Идентификаторы с блоком область действия объявлена ​​в одном блоке [1 024].
    - Макро идентификаторы одновременно определяется в одной единице перевода [65 536].
    - Параметры в одной функции определение [256].
    - Аргументы в одном вызов функции [256].

    - Параметры в одно макроопределение [256].
    - Аргументы в одном вызове макроса [256].
    - Персонажи в одной логике линия источника [65 536].
    - Персонажи в строка символов, буквальная или широкая строковый литерал (после конкатенации) [65 536].
    - Размер объекта [262 144].
    - Уровни вложенности для #include файлы [256].
    - Этикетки для оператор переключения (исключая те, для любые вложенные операторы switch) [16 384].
    - данные членов в одном класс, структура или объединение [16 384].
    - Константы перечисления в одном перечисление [4 096].
    - Уровни вложенный класс, структура или объединение определения в одном структура-объявление-список [256].
    - Функции, зарегистрированные atexit () [32].
    - Прямые и косвенные базовые классы [16 384].
    - Прямые базовые классы для одноместный класс [1024].
    - Члены объявлен в одном классе [4 096].
    - Окончательное переопределение виртуальных функций в класс, доступный или нет [16 384].
    - Прямые и косвенные виртуальные базы класс [1 024].
    - Статические члены класс [1 024].
    - Объявления друзей в классе [4 096].
    - Контроль доступа объявления в классе [4 096].
    - Инициализаторы членов в конструкторе определение [6 144].
    - Сфера квалификации одного идентификатора [256].
    - Вложенный внешний технические характеристики [1 024].
    - Шаблон аргументы в объявлении шаблона [1 024].
    - Рекурсивно вложенный шаблон экземпляры [17].
    - Погрузчики за попробуйте блок [256].
    - Брось спецификации на одну функцию объявление [256].

Кроме того, он также говорит в $ 18,3 / 6,

Пределы реализации: реализация должна поддерживать регистрация не менее 32 функций.

24 голосов
/ 03 января 2011

2.Язык С

5.2.4.1 Пределы перевода

Реализация должна иметь возможность переводить и выполнять по крайней мере одну программу , которая содержит по крайней мере один экземпляр каждого из следующих пределов:
- 127 уровней вложенности блоков
- 63 уровня вложенности условного включения
- 12 объявлений указателей, массивов и функций (в любых комбинациях), изменяющих арифметику, структуру, объединениеили неполный тип в объявлении
- 63 уровня вложенности объединенных в скобки деклараторов в полном деклараторе
- 63 уровня вложенности выражений в скобках в полном выражении
- 63 значащих начальных символа во внутреннем идентификаторе или макросеимя (имя универсального символа или расширенный исходный символ считается одним символом)
- 31 значащий начальный символ во внешнем идентификаторе (каждое имя универсального символа
, задающее короткий идентификатор 0000FFFF или менее, считается 6 символами, каждыйUniveИмя символа rsal, задающее короткий идентификатор 00010000 или более, считается 10 символами, и каждый расширенный исходный символ считается тем же числом символов, что и соответствующее имя универсального символа, если оно есть)
- 4095 внешних идентификаторов в одной единице перевода
- 511 идентификаторов с областью блока, объявленной в одном блоке
- 4095 макроидентификаторов, одновременно определенных в одной единице преобразования предварительной обработки
- 127 параметров в одном определении функции
- 127 аргументов в одном вызове функции

- 127 параметров в одном определении макроса
- 127 аргументов в одном вызове макроса
- 4095 символов в строке логического источника
- 4095 символов в буквенном или широком строковом литерале (послеобъединение)
- 65535 байт в объекте (только в размещенной среде)
- 15 уровней вложенности для # включенных файлов
- 1023 метки регистра для оператора switch (исключая метки для любого nоператоры ested switch)
- 1023 члена в одной структуре или объединении
- 1023 константы перечисления в одном перечислении
- 63 уровня вложенных определений структуры или объединения в одном списке struct-объявление

Тем не менее, в примечаниях говорится, что

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

7 голосов
/ 03 января 2011

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

Например, в архитектуре VAX CPU используется 8-битное поле, которое содержит количество аргументов, поэтому совместимый код VAX не может передавать более 255 параметров.

Точно так же многие малые процессоры, такие как семейство Intel 8048 , настолько ограничены для памяти, что большинство компиляторов C и C ++ огорчаются, если используются более четырех параметров. Хотя многие основные разработчики могут насмехаться над 8048, его потомки остаются одним из наиболее широко развернутых процессоров - в основном во встроенных устройствах.

Многие реализации архитектуры RISC определяют метод передачи параметров с использованием регистров, а не стека. Например, базовый процессор ARM имеет только 16 регистров. Максимальное количество параметров вполне может зависеть от параметров командной строки компилятора, которые влияют на то, как он генерирует код для передачи параметров. Возможно, больше восьми помещено в стек. Возможно нет.

Если эти примеры кажутся чрезмерно ограничительными, учтите, что Palm OS ограничивает функцию C одним параметром, и это должно быть типа int или void *.

4 голосов
/ 03 января 2011

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

...