За void

17 отговора 0 прегледа
#1

За void

Има ли разлика между
int main(void)
и
int main() ?
Ако има, каква точно е?


Отговор
в отговор на naki #2

Re: За void

Ima, ako pishesh na C.

Отговор
в отговор на Om #3

Re: За void

Ама различен код ли ще генерира компилатора?


Отговор
в отговор на naki #4

Re: За void

Пробвай бе. Буилдера при компилацията може да ти създаде и листинг с асемблерния код. Предполагам, че и Студиото го може.


... for a brief moment it seemed that rock 'n roll would inherit the earth.
Отговор
в отговор на naki #5

Re: За void

Има значение при декларирането на функция, не при дефиницията й. Не си спомням подробности, а не ми се рови из стандарти. Компилаторът няма да генерира различен код.

If I could remember the names of all those particles I would have been botanist -- Fermi
Отговор
в отговор на naki #6

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?_
Отговор
в отговор на Colombino #7

Re: За void

int f() май се води K&R C, a int f(void) - ANSI C.

А ако не уцелиш типа и бройката - ясно какво става - д.с.

Отговор
в отговор на vm #8

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?_
Отговор
в отговор на Colombino #9

Re: За void

Да и ако решиш да дефинираш фунции с еднакви имена и тип на параметрите но едната с повече какво става тогава.В C++ това е възможно


Pecunia non olet!
Отговор
в отговор на 3мeй #10

Re: За void

Бе на C не може подобно нещо.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #11

Re: За void

Няма да остане неинизиализирана стекова променлива, а ще сочи нещо в стека, което не трябва да сочи. Най-вероятно адреса, на който функцията трябва да се върне.

If I could remember the names of all those particles I would have been botanist -- Fermi
Отговор
в отговор на Colombino #12

Re: За void

аааргггххх, толко мноо простотии на едно място си е постижение

Отговор
в отговор на Colombino #13

ц си е бало мамата

щото освен сичко друго, подрежда параметрите на стека в обратен ред спрямо нормалните езици

иначе нема да замаже локална променлива, параметрите на стека ги слага викащия, а местото за локалните го резервира викания

естествено винаги можеш да получиш интересни ефекти с разни модификации от вида на stdcall, fastcall и квито още простотии се сетиш

Отговор
в отговор на | #14

Ц

викача ги слага, после е адреса на връщане, после са локалните променливи
даже параметрите няма да се разместят, щото Ц-то ги слага отзад напред

естествено ако няма модификатори

Отговор
в отговор на naki #15

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();
-----------------------------------------------------------------------
Това би могло да мине при изключени оптимизации в релеасе режим.

Отговор
в отговор на ГHУCEH®ГHOM #16

оопс

#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;
}


Отговор
в отговор на Colombino #17

Re: За void

д.с. е съкратено от "духаш супата". Говоря за общия случай, когато наистина объркаш броя и типовете на параметрите а не целиш нещо специално.

При викане с повече параметри локалните променливи няма да се разположат в/у никой от параметритe, тях (локалните) ги вкарва и изкарва извикания.

Отговор