За void
17 отговора
0 прегледа
Re: За void
Пробвай бе. Буилдера при компилацията може да ти създаде и листинг с асемблерния код. Предполагам, че и Студиото го може.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
... for a brief moment it seemed that rock 'n roll would inherit the earth.
Re: За void
Има значение при декларирането на функция, не при дефиницията й. Не си спомням подробности, а не ми се рови из стандарти. Компилаторът няма да генерира различен код.
If I could remember the names of all those particles I would have been botanist -- Fermi
If I could remember the names of all those particles I would have been botanist -- Fermi
Re: За void
В C++ е едно и също.
В C ако не пишеш f(void) означава, че имаш произволен брой аргументи и компилаторът ще ти позволи да извикаш с колкото искаш параметри от какъвто искаш тип, а ти имаш грижата в тялото на функцията да си ги извлечеш както ти е кеф. Даже май беше възможно (отдавна не съм писал на чисто C, забравят се тия работи) да дефинираш функцията f(int, int, int), а да я декларираш като f() и там където виждаш декларацията да си я викаш пак с f(a, b, c). Но какво става ако не уцелиш бройката и типа не знам.
Та различен код за функцията не се генерира, щото така или иначе конвенцията на извикване в C/C++ е, че извикващият пълни параметрите и той чисти стека.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
В C ако не пишеш f(void) означава, че имаш произволен брой аргументи и компилаторът ще ти позволи да извикаш с колкото искаш параметри от какъвто искаш тип, а ти имаш грижата в тялото на функцията да си ги извлечеш както ти е кеф. Даже май беше възможно (отдавна не съм писал на чисто C, забравят се тия работи) да дефинираш функцията f(int, int, int), а да я декларираш като f() и там където виждаш декларацията да си я викаш пак с f(a, b, c). Но какво става ако не уцелиш бройката и типа не знам.
Та различен код за функцията не се генерира, щото така или иначе конвенцията на извикване в C/C++ е, че извикващият пълни параметрите и той чисти стека.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: За void
int f() май се води K&R C, a int f(void) - ANSI C.
А ако не уцелиш типа и бройката - ясно какво става - д.с.
А ако не уцелиш типа и бройката - ясно какво става - д.с.
Re: За void
Не знам кво е 'д.с.', ма не е ясно кво става.
Примерно ако викнеш функция с 2 вместо 3 параметъра не виждам къв е проблемът. Само трябва да си сигурен при
f(a, b);
f(int a, int b, int c)
къде ша иде 'a' и къде 'b'. Третото ша остане неинициализирана стекова променлива.
При викане с повече параметри също не е ясно дали ако дефинираш локална променлива няма да се разположи върху някой параметър. А вероятно има ясна логика за това, но аз не я знам.
При всички случаи проблем няма да има със самото извикване - параметрите се вкарват/изкарват от викащия.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Примерно ако викнеш функция с 2 вместо 3 параметъра не виждам къв е проблемът. Само трябва да си сигурен при
f(a, b);
f(int a, int b, int c)
къде ша иде 'a' и къде 'b'. Третото ша остане неинициализирана стекова променлива.
При викане с повече параметри също не е ясно дали ако дефинираш локална променлива няма да се разположи върху някой параметър. А вероятно има ясна логика за това, но аз не я знам.
При всички случаи проблем няма да има със самото извикване - параметрите се вкарват/изкарват от викащия.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: За void
Да и ако решиш да дефинираш фунции с еднакви имена и тип на параметрите но едната с повече какво става тогава.В C++ това е възможно
Pecunia non olet!
Pecunia non olet!
Re: За void
Бе на C не може подобно нещо.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: За void
Няма да остане неинизиализирана стекова променлива, а ще сочи нещо в стека, което не трябва да сочи. Най-вероятно адреса, на който функцията трябва да се върне.
If I could remember the names of all those particles I would have been botanist -- Fermi
If I could remember the names of all those particles I would have been botanist -- Fermi
ц си е бало мамата
щото освен сичко друго, подрежда параметрите на стека в обратен ред спрямо нормалните езици
иначе нема да замаже локална променлива, параметрите на стека ги слага викащия, а местото за локалните го резервира викания
естествено винаги можеш да получиш интересни ефекти с разни модификации от вида на stdcall, fastcall и квито още простотии се сетиш
иначе нема да замаже локална променлива, параметрите на стека ги слага викащия, а местото за локалните го резервира викания
естествено винаги можеш да получиш интересни ефекти с разни модификации от вида на stdcall, fastcall и квито още простотии се сетиш
Ц
викача ги слага, после е адреса на връщане, после са локалните променливи
даже параметрите няма да се разместят, щото Ц-то ги слага отзад напред
естествено ако няма модификатори
даже параметрите няма да се разместят, щото Ц-то ги слага отзад напред
естествено ако няма модификатори
Re: За void
Няма никаква разлика.
---------------------------файл а0.с-------------------------------
int _cdecl f( int a, int b, int c ){ return a + b + c;}
---------------------------файл а1.с-------------------------------
extern "C" int _cdecl f( void );
int main() {
volatile int c,b,a;
a = b = c = 1;
return f();
-----------------------------------------------------------------------
Това би могло да мине при изключени оптимизации в релеасе режим.
---------------------------файл а0.с-------------------------------
int _cdecl f( int a, int b, int c ){ return a + b + c;}
---------------------------файл а1.с-------------------------------
extern "C" int _cdecl f( void );
int main() {
volatile int c,b,a;
a = b = c = 1;
return f();
-----------------------------------------------------------------------
Това би могло да мине при изключени оптимизации в релеасе режим.
оопс
#include <stdio.h>
void f2(int a,int b) {
printf("f2(%d,%d)\n",a,b);
}
typedef void tf1(int);
tf1* f1 = (tf1*)&f2;
typedef void tf3(int,int,int);
tf3* f3 = (tf3*)&f2;
int main() {
f1(1);
f2(1,2);
f3(1,2,3);
return 0;
}
Re: За void
д.с. е съкратено от "духаш супата". Говоря за общия случай, когато наистина объркаш броя и типовете на параметрите а не целиш нещо специално.
При викане с повече параметри локалните променливи няма да се разположат в/у никой от параметритe, тях (локалните) ги вкарва и изкарва извикания.
При викане с повече параметри локалните променливи няма да се разположат в/у никой от параметритe, тях (локалните) ги вкарва и изкарва извикания.