Неименованные переменные
От: insanio www.falsecode.ru
Дата: 30.01.08 05:21
Оценка:
Вопрос про неименованные переменные.

Помнится попадалась на глаза вот такая конструкция объявления функции:


void func(int)
{
}


а как к этой самой int в функции обратится?
---
if it works, dont fix it.
Re: Неименованные переменные
От: jazzer Россия Skype: enerjazzer
Дата: 30.01.08 05:23
Оценка:
Здравствуйте, insanio, Вы писали:

I>Вопрос про неименованные переменные.


I>Помнится попадалась на глаза вот такая конструкция объявления функции:



I>
I>void func(int)
I>{
I>}
I>


I>а как к этой самой int в функции обратится?


никак
такая конструкция как раз и является признаком того, что ты не собираешься использовать этот аргумент внутри функции.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Неименованные переменные
От: insanio www.falsecode.ru
Дата: 30.01.08 05:34
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, insanio, Вы писали:


I>>Вопрос про неименованные переменные.


I>>Помнится попадалась на глаза вот такая конструкция объявления функции:



I>>
I>>void func(int)
I>>{
I>>}
I>>


I>>а как к этой самой int в функции обратится?


J>никак

J>такая конструкция как раз и является признаком того, что ты не собираешься использовать этот аргумент внутри функции.

А как насчет перемного количества входных переменных? Как быть в этом случае?


void func(int x, ...)
{
}
---
if it works, dont fix it.
Re[3]: Неименованные переменные
От: jazzer Россия Skype: enerjazzer
Дата: 30.01.08 05:53
Оценка:
Здравствуйте, insanio, Вы писали:

I>А как насчет перемного количества входных переменных? Как быть в этом случае?



I>
I>void func(int x, ...)
I>{
I>}
I>

макросами va_arg, va_start, va_end.
гугль в помощь
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Неименованные переменные
От: ser_gunya  
Дата: 30.01.08 08:06
Оценка:
Здравствуйте, 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, остальные переменные находятся после неё подряд, с учетом размера каждой переменной.
в случае с безымянной переменной у вас нету её адреса, соответственно нельзя обратиться
Re[4]: Неименованные переменные
От: Bell Россия  
Дата: 30.01.08 08:31
Оценка:
Здравствуйте, ser_gunya, Вы писали:

_>в этом случае вы имеете адрес первой переменной — x, остальные переменные находятся после неё подряд, с учетом размера каждой переменной.

Выравнивание тоже пока еще никто не отменял:
void f(int i, ...)
{
   int*  p1 = &i;
   char* p2 = (char*)p1 + 4;
   int*  p3 = (int*)((char*)p1 + 4 + 4);//Заметьте, не p1 + 4 + 1

   int nnn = 0;
}

int main (void)
{
   int i = 1;
   char c = '1';
   f(i, c, i);

   return 0;
}


Любите книгу — источник знаний (с) М.Горький
Re[5]: Неименованные переменные
От: AlexCrush Россия  
Дата: 30.01.08 09:54
Оценка: +2
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, ser_gunya, Вы писали:

B>void f(int i, ...)
B>{
B> int* p1 = &i;
B> char* p2 = (char*)p1 + 4;
B> int* p3 = (int*)((char*)p1 + 4 + 4);//Заметьте, не p1 + 4 + 1
B>

Капец. Надеюсь это Вы просто для демонстрации написали. Ни дай бог никому такого кода...
Раз уж приперло использовать эллипсис, так и юзайте va_*. Откуда вообще известно, что переменные в ... идут после i, а, например, не до?
Re[6]: Неименованные переменные
От: Bell Россия  
Дата: 30.01.08 09:57
Оценка:
Здравствуйте, AlexCrush, Вы писали:

AC>Капец. Надеюсь это Вы просто для демонстрации написали. Ни дай бог никому такого кода...


Ну не зря же смайлик там стоит...
Любите книгу — источник знаний (с) М.Горький
Re: Неименованные переменные
От: Аноним  
Дата: 30.01.08 22:24
Оценка:
Здравствуйте, insanio, Вы писали:

I>Вопрос про неименованные переменные.


I>Помнится попадалась на глаза вот такая конструкция объявления функции:



I>
I>void func(int)
I>{
I>}
I>


I>а как к этой самой int в функции обратится?



simple.h
void func(int);

simple.cpp
void func(int n)
{
}
Re[2]: Неименованные переменные
От: insanio www.falsecode.ru
Дата: 31.01.08 03:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>simple.h
А>void func(int);

А>simple.cpp
А>void func(int n)
А>{
А>}
А>


О, похоже вот такую конструкцию я и встречал.

Спасибо, всем.
---
if it works, dont fix it.
Re[5]: Неименованные переменные
От: achp  
Дата: 01.02.08 11:30
Оценка:
Здравствуйте, Bell, Вы писали:

B>Выравнивание тоже пока еще никто не отменял:


Не выравнивание, а стандартное продвижение типа.
Re: Неименованные переменные
От: ДимДимыч Украина http://klug.org.ua
Дата: 01.02.08 13:10
Оценка:
Здравствуйте, 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;
}
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Неименованные переменные
От: Кодт Россия  
Дата: 01.02.08 16:55
Оценка:
Здравствуйте, achp, Вы писали:

B>>Выравнивание тоже пока еще никто не отменял:

A>Не выравнивание, а стандартное продвижение типа.

И продвижение, и выравнивание.
Другое дело, что на вменяемых платформах эти вещи увязаны.
Но, например, если long double — 10-байтовое (по стандарту IEEE 754), а стек выравнен на 4 байта, — куда уж дальше продвигать? Только выравнивать.
(Кстати, Comeau online считает, что sizeof(long double) = 12, а VC — наоборот, 8).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Неименованные переменные
От: shank  
Дата: 02.02.08 14:00
Оценка:
Здравствуйте, insanio, Вы писали:
I>
I>void func(int)
I>{
I>}
I>


I>а как к этой самой int в функции обратится?

void func(int)
{
    std::cout << __formal << std::endl;
}

ms-specific
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.