Подтвердить что ты не робот

Максимальное количество параметров в объявлении функции

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

4b9b3361

Ответ 1

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

1. Язык С++


Приложение B - объемы реализации

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

  • Пределы могут ограничивать количества, которые включают в себя описанные ниже или другие. Число в квадратных скобках, следующее каждое количество рекомендуется в качестве минимум для этой величины. Однако, эти величины являются только рекомендациями и не определяют соответствие.
    - Уровни вложения составных операторов, итерационных структур управления и структуры контроля выбора [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 (исключая любые вложенные операторы switch) [16 384].
    - Элементы данных в одном класс, структура или объединение [16 384].
    - Константы перечисления в одном перечисление [4 096].
    - Уровни вложенный класс, структура или объединение определения в одном struct-declaration-list [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 функций.

Ответ 2

2. C Язык


5.2.4.1 Ограничения перевода


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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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