2011-01-03 4 views
22

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

+2

Такие ограничения всегда определены в документации вашего компилятора. IOW вам нужно указать конкретный компилятор, чтобы получить точные числа. Они являются большими для общего использования. В нескольких правилах кодирования предлагается не создавать функции с более чем 5 аргументами (путь меньше, чем обычно разрешено). –

ответ

34

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

1. C++ Язык


Приложение 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].
    - Уровни Вложенный класс, структура или объединение определения в одном 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].
    - Обработчики на блок try [256].
    - Throw спецификации по одной функции декларация [256].

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

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

+0

Получил ссылку на стандарт онлайн? – Yttrill

+0

@Yttrill ANSI и ISO зарабатывают деньги, продавая копии стандарта. Он не является бесплатным; если вам нужен Стандарт, вы (или ваш работодатель) должны заплатить. Тем не менее, есть проекты предварительной доработки, если это достаточно хорошо для ваших целей. Я не знаю ни одного проекта C++, но C-проектные стандарты можно найти в googling 'n1256'. –

+0

Что означает «Размер объекта»? Включает ли это инкапсулированные данные, или это просто сумма размеров типов членов (много OFs там)? – adam10603

4

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

+1

Если вы пишете функцию C++ с несколькими аргументами, вероятно, вы должны кричать в Комитете, чтобы сделать кортежи проще в использовании :) – Yttrill

+4

Это лучший ответ. Максимум «больше, чем вы когда-либо использовали». –

+8

Я задал этот вопрос из любопытства. – Nawaz

20

2. C Язык


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


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

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

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

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

+0

У вас есть ссылка на эту документацию? –

+2

@ Mr.32: Google для языка C12 n1256. При поиске я получил эту ссылку: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – Nawaz

+0

спасибо, что ............ –

5

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

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

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

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

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

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