При подключении gdktypes.h из gtk+-2.2 в препроцессорном листинге есть строки
typedef __builtin_va_list __gnuc_va_list;
typedef __gnuc_va_list va_list;
У __builtin_va_list неизвестен базовый тип. В каком файле его можно найти?
P.S. gcc 4.1.1
Поставлю вопрос по-другому.
В том же файле(после препроцессора) есть функции, например:
gint g_vsnprintf (gchar *string, gulong n, gchar const *format, va_list args);
…
gchar *g_markup_vprintf_escaped (const char *format, va_list args);
…
guint g_signal_new_valist (const gchar *signal_name, GType itype, GSignalFlags signal_flags, GClosure *class_closure, GSignalAccumulator accumulator, gpointer accu_data, GSignalCMarshaller c_marshaller, GType return_type, guint n_params, va_list args);
…
Как определить тип args?
Если это просто количество аргументов функции, тогда int.
Если что-то похожее на printf(), тогда структура какая-то…
насколько мне известно, исходя из данных, в va_arg/va_list тип определить невозможно. тип должен определяться как-то извне. в printf и т.п. для этого парcится строка с форматом. если формат не совпадает - возникает ошибка обращения к памяти.
Вот, нашел программку http://invisible-island.net/cproto/. Она генерит прототипы C-функций и конвертирует их определения. В CHANGES записано
ты, собственно, чего хочешь добиться от компилятора?
методы использования va_arg/va_list задокументированы в доках по С++. они не менялись, определения RTTI типов там нет, не было и не будет. используются они с заранее известными типами аргументов, либо информацию о типах в функцию передаёт сам программист, как ему удобнее.
От компилятора ничего Нужно __builtin_va_list собрать из базовах типов. Я с этого начал
Про С++(RTTI) -- это новость. Ведь gtk+ написан на простом си. Насколько я знаю va_arg – это макрос
type va_arg(va_list argptr, type);
макросы макросами, но ни с C++, ни в C у va_list нет никакого "определения". это не тип вообще. это просто метод передачи параметров через стек, и только. и он зависит от платформы и от компилятора. это просто указание компилятору, что нужно засунуть в стек параметры, а потом извлечь их и передать юзеру. если хочешь знать, как это конкретно реализовано в конкретном компиляторе - читай сорцы компилятора.
Вот, нашел в cygwin/mingw.
#ifndef _VA_LIST
#define _VA_LIST
#if defined __GNUC__ && __GNUC__ >= 3
typedef __builtin_va_list va_list;
#else
typedef [b]char*[/b] va_list;
#endif
#endif
Всё кажется понял.
Например, есть функция
va_start (args, message_format);
msg = g_strdup_vprintf (message_format, args);
va_end (args);
#define va_arg(v,l) __builtin_va_arg(v,l)
/* varargs.h. */
#ifndef __va_list__
#define __va_list__
typedef char *va_list;
#endif
#define va_dcl int va_alist;
#define va_start(list) list = (char *) &va_alist
#define va_end(list)
#define va_arg(list,mode) ((mode *)(list += sizeof(mode)))[-1]
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)