2017-02-23 3 views
-4

cstdarg может использоваться для переменного количества аргументов в C++.Можно ли использовать cstdarg?

Пошли шаг за шагом. После вызова функции аргументы вставляются в стек по порядку.

Если я даю неимоверно большое количество аргументов stackoverflows и сбоев ПК.

Это правильно? Если это так, небезопасно ли кому-либо использовать cstdarg?

+1

По этой логике небезопасно использовать указатель, потому что это может не указывать на действительный объект. –

+2

Что такое cstdarg.h? Вы имеете в виду ''? –

+3

_ «Если я даю неимоверно большое количество аргументов stackoverflows и pc crashes.Это правильно? Если это так, разве небезопасно для кого-либо использовать cstdarg?» _ Это полный нелогичный. Как вы пришли к такому выводу? Например, если вы будете ездить на 6999999 MPH, тогда вы рухнете, и люди умрут; делает ли это все автомобили «небезопасными для кого-либо использовать»? Нет .. –

ответ

0

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

Предел, который вы ищете, вероятно, «Аргументы в одном вызове функции», рекомендуемый минимальный предел которого составляет 256 в C++ 14. Обратитесь к документации вашего компилятора за фактическим пределом.

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

+0

Благодарим вас за добрый ответ. Kerrek SB –

+0

Это не обязательно означает, что передача 256 аргументов безопасна. Обычно компиляторы не устанавливают фиксированные лимиты; переменные пределы могут зависеть от доступной памяти. Вы могли бы передать 256 аргументов в одном случае, но в другом может быть недостаточно памяти, потому что она потребляется другими вещами или потому, что аргументы велики. –

+0

@KeithThompson: Это правда; в некотором смысле, вы вообще не знаете, действительно ли вам разрешено вызывать любую функцию в любой точке, если у вас нет полного контекста, так как вы можете оказаться в конце стека вызовов. –

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