Rel Глянул несколько примерчиков, так ведь все равно используется один именной параметр. Код (Text): void __cdecl funct(int cnt, ...) { va_list vl; va_start(vl, cnt); for(int i = 0; i != cnt; i++) { std::string& str = va_arg(vl, std::string); printf("str = %s\n", str.c_str()); } va_end(vl); } А как без именного параметра (и без ассемблера) к аргументам в теле функции обратиться? Можете примерчик привести? Код (Text): func () { //Как обратиться к аргументам? } int main(void) { func (3,4,5,6); return(0); }
"при cdecl" - точнее говоря при том соглашении вызова, при котором вызывающий сам чистит стек хотя в теории возможен код "pop edx / add esp, n / jmp edx" вместо "ret n"
например так: _AddressOfReturnAddress даст вам указатель на адрес возврата на стеке, параметры лежат рядышком...
Nafanya в С++ Код (Text): #include <intrin.h> va_start(va, *_AddressOfReturnAddress()); -- на 2 сек опоздал =)
ну внутри функции можно рассчитать, насколько стек нужно подчистить, но не понятно пока, как реализовать без асм-вставок) бывает)
Блин, ну я же просил почитать примеры моего кода и изучить конвенции вызовов, cdecl, в частности... Держите пример работы с функцией вообще без формальных аргументов на си, раз Вы этого так желаете. Код (Text): #include <stdio.h> int func() { #ifdef _MSC_VER int* stack; _asm { mov stack, ebp } #else static int* stack __asm("sstack"); __asm("mov %ebp, sstack;"); #endif return *(stack + 2) + *(stack + 3); } int main(void) { int a = 2, b = 3; printf("%u + %u = %u", a, b, func(a, b)); return 0; } Работает в ms visual studio и dev cpp, и похоже, что на линухе тоже: http://codepad.org/E69lGkop Пролог у функций везде одинаков: push ebp; mov ebp, esp. Хотя вижу Вам тут решение уже предложили, хотя _AddressOfReturnAddress это Microsoft-specific
в басике? в компилируемом басике это есть? про интерпретируемые языки вопросов вообще не должно быть, так как там свой байт-код, в котором может быть все, что угодно... вы бы сделали действительно переменное число параметров)) и кстати на x64 работать не будет)))
GRRRLPower Сильно конечно! А Вы можете сделать тот же простой пример без асм вставок - чистым сишняком? Интересно взглянуть-как это будет выглядеть. Или это unreal
Си фиолетово на кол-во параметров и их типы, в общем ассемблер. Можно объявить функцию с одним параметром, а передать десять. Объявить тип int, а передать что угодно другое. Но только должен быть _cdecl конечно. Даже и объявлять в Си необязательно, линковщик найдёт и прилинкует без посторонней помощи.
_cdecl скорее, с _stdcall произвольное число аргументов не прокатит, я выше пару примеров приводил уже...
а да... я чет не увидел * после инта) первая мысль... но как может x64 нормально работать с ebp, а не rbp? вы видимо 32-битный бинарник собираете и запускаете в WOW64... я тебе недавно сказал, как обойтись без асм-вставки... но на gcc нужно добавлять интрин, в стандартной пачке не обойтись наверное... в студии есть _AddressOfReturnAddress...
Да, так и есть. На самом деле, мне неизвестны x64-компиляторы, которые бы директиву __asm поддерживали MSVC, например, не поддерживает в x64-режиме.
С++ тоже допускает подобные ф-ции: Код (Text): int func(...); Переносимого способа получить параметры такой ф-ции нет.
возможно использовать любой сторонний асм-компилятор (я юзаю yasm) и делать inline функции... по сути тоже самое, что и асм вставка... вообще интрин-функции в msvc так и сделаны... и я думал, что mingw-w64 поддерживает асм вставки, хотя я никогда ее не использовал... и интрин функции там есть вроде... ADD: посмотрел интрин-функции в mingw-w64, там нет _AddressOfReturnAddress... и все интрин-функции сделаны асм-вставками, в них похоже не участвуют специфичные для x64 команды... довольно странно))