Как создать список аргументов для vscanf / vprinf напрямую? - PullRequest
1 голос
/ 19 июня 2019

Я знаю, как вызвать vprintf и т. Д. Из реализации printf соответственно.

Но что, если я хочу динамически создавать список аргументов в коде, особенно для vsscanf, где я знаю, что они все указатели?

Есть ли какой-нибудь достаточно переносимый способ, которым я могу преобразовать мой динамически размещенный и заполненный массив указателей (на самом деле std :: vector) в va_list?

Это все для того, чтобы я мог добавить в конец аргумент% n и определить, сколько фактически было использовано ввода, чтобы дать ответ на ftell в моей собственной FILE-подобной оболочке.

Кроме того, чтобы сделать что-то волосатое с трубкой; или написание моей собственной реализации; или разделение строки и выполнение одного аргумента за раз; Я не вижу, как еще я могу определить использование входного потока, особенно для sscanf. Так что другие идеи на этот счет могут быть интересны.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Списки аргументов, будь они фиксированного или переменного размера, являются статическими объектами времени компиляции. Таким образом, во время выполнения вы можете читать их, но не создавать. Вместо этого используйте обычные указатели.

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

0 голосов
/ 11 июля 2019

XY ответ: В конце концов я использовал fopencookie и vfscanf, поэтому мне не пришлось ни обрабатывать аргументы, ни обрабатывать строку формата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...