Невизначена кількість аргументів функції - stack overflow російською

Про stdarg вже сказали. Чудненько.

Але в С ++ 11 з'явився новий потужний інструмент - шаблони зі змінним числом аргументів (variadic templates). Детально описувати не буду, можете почитати тут. а потім погуглити. Також непоганий опис є в новому виданні Джосаттіса The CPP Standard Library (начебто повинні скоро по-російськи видати).

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

Для доступу треба використовувати покажчик, кожен наступний аргумент "відстоїть" від іншого на sizeof зазначеного типу, тому треба нарощувати покажчик на цю величину за допомогою + = наприклад. Щоб дізнатися кінець списку аргументів використовують такі прийоми - або один з явних аргументів означає кількість фактичних "невизначених" аргументів, або використовують значення-маркер для останнього аргументу (наприклад 0, NULL, -1 - головне щоб таке значення не було "легальним" за логікою самої функції Детальніше тут або тут. Взагалі ця тема легко гугл, тому тут не особливо намагаюся дати повну інфу по темі, але якщо що буде незрозуміло - питайте, допоможу

В принципі, так, в C ++ є можливість створення функцій з невідомим заздалегідь числом параметрів. Для цього використовується ось такий синтаксис:

Як бачите, для вказівки того, що число параметрів невідомо, ставиться три крапки. При цьому слід пам'ятати, що у такої функції повинен бути визначений перший параметр (його тип і ім'я), так як взаємодія з усіма іншими аргументами ґрунтується на діях з покажчиками - доступ до наступних аргументів здійснюється побічно - через покажчик на перший. Додаючи зміщення до pFirst ви зможете звертатися до наступних аргументів функції. Для вашого прикладу це буде виглядати так: pFirst [16].

Потрібно сказати, що даний спосіб - не дуже вдале рішення, так як в цьому випадку можуть виникнути проблеми з тіпобезопасностью - в принципі, ви можете передавати аргументи будь-яких типів, і компілятор нічого не скаже, але в Рантайм це значною кількістю помилок. Сответсвенно, данни спосіб більше опдходіт для передачі ряду однотипних значень, але для цієї мети в більшості випадків набагато раціональніше використовувати масив

Схожі статті