Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, insanio, Вы писали:
I>>Вопрос про неименованные переменные.
I>>Помнится попадалась на глаза вот такая конструкция объявления функции:
I>>
I>>void func(int)
I>>{
I>>}
I>>
I>>а как к этой самой int в функции обратится?
J>никак J>такая конструкция как раз и является признаком того, что ты не собираешься использовать этот аргумент внутри функции.
А как насчет перемного количества входных переменных? Как быть в этом случае?
Здравствуйте, insanio, Вы писали:
I>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, insanio, Вы писали:
I>>>Вопрос про неименованные переменные.
I>>>Помнится попадалась на глаза вот такая конструкция объявления функции:
I>>>
I>>>void func(int)
I>>>{
I>>>}
I>>>
I>>>а как к этой самой int в функции обратится?
J>>никак J>>такая конструкция как раз и является признаком того, что ты не собираешься использовать этот аргумент внутри функции.
I>А как насчет перемного количества входных переменных? Как быть в этом случае?
I>
I>void func(int x, ...)
I>{
I>}
I>
в этом случае вы имеете адрес первой переменной — x, остальные переменные находятся после неё подряд, с учетом размера каждой переменной.
в случае с безымянной переменной у вас нету её адреса, соответственно нельзя обратиться
Здравствуйте, ser_gunya, Вы писали:
_>в этом случае вы имеете адрес первой переменной — x, остальные переменные находятся после неё подряд, с учетом размера каждой переменной.
Выравнивание тоже пока еще никто не отменял:
void f(int i, ...)
{
int* p1 = &i;
char* p2 = (char*)p1 + 4;
int* p3 = (int*)((char*)p1 + 4 + 4);//Заметьте, не p1 + 4 + 1int nnn = 0;
}
int main (void)
{
int i = 1;
char c = '1';
f(i, c, i);
return 0;
}
Капец. Надеюсь это Вы просто для демонстрации написали. Ни дай бог никому такого кода...
Раз уж приперло использовать эллипсис, так и юзайте va_*. Откуда вообще известно, что переменные в ... идут после i, а, например, не до?
Здравствуйте, insanio, Вы писали:
I>Помнится попадалась на глаза вот такая конструкция объявления функции: I>
I>void func(int)
I>
I>а как к этой самой int в функции обратится?
Историческая справка: в очень старых версиях C (или даже еще не C, а его предшественника) не разделялись аргументы и локальные переменные. Поэтому для передачи например двух аргументов в функцию использовался такой механизм:
void func(int, int)
{
/* адреса двух нижеследующих локальных переменных совпадали с адресами аргументов в стеке */int first_arg;
int second_arg;
/* а дальше следовали "настоящие" локальные переменные */int local_var1;
int local_var2;
}
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, achp, Вы писали:
B>>Выравнивание тоже пока еще никто не отменял: A>Не выравнивание, а стандартное продвижение типа.
И продвижение, и выравнивание.
Другое дело, что на вменяемых платформах эти вещи увязаны.
Но, например, если long double — 10-байтовое (по стандарту IEEE 754), а стек выравнен на 4 байта, — куда уж дальше продвигать? Только выравнивать.
(Кстати, Comeau online считает, что sizeof(long double) = 12, а VC — наоборот, 8).