Здравствуйте, гость ( Вход | Регистрация )
ido | Дата 23.3.2011, 20:27 |
Всё кажется понял. Например, есть функция
Макросы va_start/va_end – поддержка рантайма. Они прогоняют аргументы функции через стэк.
Только __builtin_va_arg теряется где-то в парсерах/лексерах. |
|
ido | Дата 23.3.2011, 9:29 |
Вот, нашел в cygwin/mingw.
К плюсам имеют отношение, скорее всего, __attribute__ __extension__ __const __restrict Например gchar* g_strdup_vprintf (const gchar *format, va_list args) __attribute__((__malloc__)) ; Но как это обрабатывается – найти в сорцах и не получается. |
|
Iron Bug | Дата 23.3.2011, 7:28 |
макросы макросами, но ни с C++, ни в C у va_list нет никакого "определения". это не тип вообще. это просто метод передачи параметров через стек, и только. и он зависит от платформы и от компилятора. это просто указание компилятору, что нужно засунуть в стек параметры, а потом извлечь их и передать юзеру. если хочешь знать, как это конкретно реализовано в конкретном компиляторе - читай сорцы компилятора. | |
ido | Дата 23.3.2011, 6:39 |
От компилятора ничего Нужно __builtin_va_list собрать из базовах типов. Я с этого начал Про С++(RTTI) -- это новость. Ведь gtk+ написан на простом си. Насколько я знаю va_arg – это макрос type va_arg(va_list argptr, type); |
|
Iron Bug | Дата 21.3.2011, 23:02 |
ты, собственно, чего хочешь добиться от компилятора? методы использования va_arg/va_list задокументированы в доках по С++. они не менялись, определения RTTI типов там нет, не было и не будет. используются они с заранее известными типами аргументов, либо информацию о типах в функцию передаёт сам программист, как ему удобнее. |
|
ido | Дата 21.3.2011, 16:05 |
Вот, нашел программку cproto. Она генерит прототипы C-функций и конвертирует их определения. В CHANGES записано Цитата - add gcc-specific __builtin_va_list keyword. Теперь, во-первых, непонятно как ей передать параметры обычные для компиляции gtk+ (pkg-config…). Пытался тупо подставлять __builtin_va_list в пример – ничего не меняется, хотя из самого примера с main() прототип получается. |
|
Iron Bug | Дата 21.3.2011, 13:59 |
Т.е парсится во время компиляции каким-то макросом нет. парсится в риалтайме, как стандартно парсятся переменные параметры, передаваемые через стек (va_arg и иже с ним). компилятор не делает никаких проверок насчёт содержимого va_arg. потому что он просто не может их делать. в общем, это обычные функции с переменным числом параметров. выкопать типы в условиях переменного количества параметров просто нереально. RTTI не передаётся явно. если очень хочется, можно сделать иерархию классов, передавать указатель на базовый класс и проверять typeid внутри самой функции. |
|
ido | Дата 21.3.2011, 8:22 |
в printf и т.п. для этого парcится строка с форматом. Т.е парсится во время компиляции каким-то макросом, размещается в некой структуре по каким-то правилам? Тогда в исходниках(gcc) должна быть последовательность выполняемых операций.В ChangeLog’e gcc-2.95 есть единственное упоминание: ginclude/varargs.h(va_dcl): Use word_mode for type of __builtin_va_list В gcc-3.3 много, где используется. Используется, но не определяется. Вот, пример из c-common.c: (* lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, get_identifier("__builtin_va_list"), ptrdiff_type_node)); Но, что бы это значило… |
|
Iron Bug | Дата 20.3.2011, 20:22 |
насколько мне известно, исходя из данных, в va_arg/va_list тип определить невозможно. тип должен определяться как-то извне. в printf и т.п. для этого парcится строка с форматом. если формат не совпадает - возникает ошибка обращения к памяти. | |
ido | Дата 20.3.2011, 9:24 |
Поставлю вопрос по-другому. В том же файле(после препроцессора) есть функции, например: 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(), тогда структура какая-то… |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 12:49 |