Поддерживая Angus, я могу ручаться за http://www.clickatell.com . Это использовалось в компании, в которой я раньше работал. Это было очень легкое решение установить и использовать и работавший отлично. Просто необходимо ожидать, сколько сообщений Вы намереваетесь отослать и сообщения оптового заказа. Они являются довольно дешевыми в целом.
Если у вас есть время и вам действительно любопытно, вы можете изучить версию GNU libc: См. printf , который, в свою очередь, использует vprintf, который использует vfprintf
Справочная страница Linux va_start (3) дает очень хороший пример написания таких функций (намного проще, но в целом есть все основные кирпичики). Также вы можете изучить практически любую реализацию libstdc.
Есть по крайней мере две книги с хорошими объяснениями того, как можно написать функцию форматирования, подобную printf ()
(и полные рабочие примеры):
Этот ответ может помочь вам понять, как писать вариативные функции. Обратите внимание, что проверка ошибок / границ не выполняется, атрибуты не устанавливаются, чтобы сообщить компилятору, какие аргументы могут быть подходящими, никаких преимуществ по сравнению с использованием printf () не достигается.
Это может быть или не быть вашим примером ищу.
Соответствующий фрагмент (здесь немного расширен):
#include <stdarg.h>
void _printf(FILE *out, va_list ap)
{
vfprintf(out, fmt, ap);
}
void printf(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
_printf(stdout, ap);
va_end(ap);
}
Примечание: заставить их возвращать правильный тип (целое число со знаком) остается в качестве упражнения для читателя. Для меня это очень похоже на домашнее задание, я просто пытаюсь избавить вас от любых проблем с использованием va_start и va_end, а также показывать, что va_list можно передать вспомогательным функциям, чтобы избежать дублирования кода во многих реализациях почти то же самое.
Я настоятельно рекомендую взглянуть на реализацию подсистемы printf в BSD (или даже glibc). Вы также можете посмотреть uclibc, dietlibc и т. Д.