PDA

Visualizza la versione completa : [C/C++] Una mia teoria sul main()


XWolverineX
03-11-2005, 20:23
Salve.
Quello che segue potrebbe non essere vero,forse sono solo considerazioni di un povero pazzo, ma è un tarlo che mi perseguita da tanto tempo.

Sia in C che in C++, tutti i programmi iniziano con la funzione main()
Dopo molti programmi con codice sorgente libero visionati, ma anche semplici esempi di internet, molta gente ne scrive il prototipo in questi due modi
void main()
int main()
Per un bel po di tempo, quando non conoscevo il C++ (non è che ora lo conosca, ma almeno comprendo la sintassi di base, ma ad algoritmi sono a 0), non capivo il perchè di void e il perchè di int.
Facendo alcune considerazioni sono giunto a questa conclusione
int main() -> completamente inutile.
void main()-> è quello giusto per iniziare il programma.

Perchè?
Avendo scritto INT main(), vuol dire che questa funzione deve restituire un valore, come fa molta gente: quando il programma è stato eseguito correttamente, si fa return 0;, altrimenti return 1;
Per quanto io ne sappia, per controllare il valore di ritorno della funzione si fa


if (miafunzione() == parametroatteso) {codice}


Ma questo non lo si può fare dal main, poichè questa è la funzione principale e non ve ne sono altre (in ordine di tempo) prima di questa.
Impossibile quindi scrivere


if (main() == 0) {codice}


Quindi
Perchè scrivere int main() quando non potrai mai e poi mai controllarne il valore di ritorno?

Considerazioni
1) Non vi complessate: alla fine è una cazzata mortale, sono quasi certo che non influenzi il programma ne in termini di memoria ne in altro.
2) Con Gcc invece int main() può essere usato: ho sentito dire in giro che vi è una funzione prima di main, che si chiama void _start() dal quale il controllo si può fare: confermate?

Grazie a tutti!

netarrow
03-11-2005, 20:47
...
ho sentito dire in giro
...


fai le teorie per sentito dire?? :rollo:

Cmq il codice di uscita viene cmq preso dal programma che ha lanciato il processo in questione, che potrebbe essere il sistema operativo, un altro programma ecc...
Il codice di uscita, quindi il valore ritornato dalla funzione va oltre il C o il C++.

Sinceramente il void l'ho usato per main quando non avevo voglia di mettere il return alla fine in qualche esempio, programino di prova o altre cose classificabili come "tipical hello world application".

:ciauz:

XWolverineX
03-11-2005, 21:43
Ahhh...quindi il valore di ritorno potrebbe essere usato da altri programmi per controllare se il programma è andato bene.
In unix questo sarebbe spiegato dal comando di shell
programma && programma2

Se non ricordo male && esegue il secondo comando solo se il primo è andato bene.



fai le teorie per sentito dire??


hahaha... :dottò:

Avete altre spiegazioni?

Ikitt
03-11-2005, 22:10
Originariamente inviato da XWolverineX
Dopo molti programmi con codice sorgente libero visionati, ma anche semplici esempi di internet, molta gente ne scrive il prototipo in questi due modi
void main()
int main()
Per un bel po di tempo, quando non conoscevo il C++ (non è che ora lo conosca, ma almeno comprendo la sintassi di base, ma ad algoritmi sono a 0), non capivo il perchè di void e il perchè di int.
Facendo alcune considerazioni sono giunto a questa conclusione
int main() -> completamente inutile.
void main()-> è quello giusto per iniziare il programma.
Beh, uhm, eh...
void main() -> pre standard, discutibile, i compilatori lo fanno ancora passare ma sarebbe deprecato
int main() oppure int main(int argc, char *argv[]) -> le forme permesse dallo standard.
C e C++ sono molto simili in questo specifico ambito, se ben ricordo le differenze, se ci sono, sono davvero minime.



[...]
Perchè scrivere int main() quando non potrai mai e poi mai controllarne il valore di ritorno?
Non lo fa il codice stesso, ma il chiamante (shell...)



1) Non vi complessate: alla fine è una cazzata mortale, sono quasi certo che non influenzi il programma ne in termini di memoria ne in altro.
Influenzarlo lo influenza, il compilatore quantomeno emette un warning (com'e` piu` che giusto)


2) Con Gcc invece int main() può essere usato: ho sentito dire in giro che vi è una funzione prima di main, che si chiama void _start() dal quale il controllo si può fare: confermate?
No, _start serve ad un'altra cosa, se ben ricordo. Dovrebbe essere un'estensione di gcc per consentire un meccanismo simile ai costruttori/distruttori in C++.

XWolverineX
03-11-2005, 22:17
è vero: se non metti int main() il compilatore ti darà un warning

Samuele_70
03-11-2005, 22:39
Originariamente inviato da XWolverineX
...

Avete altre spiegazioni?
Ulteriori spiegazioni no ma un esempio ( ...pratico come piace a me... :fighet: ) :

Programma 'figlio' "Int_main.cpp" :


/**
* Nome file : "Int_main.cpp"
*
**/

#include <process.h>
#include <stdlib.h>
#include <stdio.h>

int main( int argc, char *argv[] )
{
int a;
if( argc == 0 ) return 999;
a = atoi(argv[1]);
a *= 2;
return a;
}


Programma 'padre' "Int_main_Parent.cpp" :
(questo mi funziona solo con il BCC32, con il GCC mi va in crash ... Magari tu riesci a farlo funzionare. :zizi: )


/**
* Nome file : "Int_main_Parent.cpp"
*
**/

#include <process.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main( int , char *argv[] )
{
unsigned int numero, result;
char *parametro, *digit;
do
{
printf("\nInserisci un numero da passare (0 per uscire): ");
scanf("%s", digit);
numero = atoi(digit);
if(numero>0 )
{
itoa(numero, parametro, 10);
printf("\nPasso il valore : %s", parametro);
result = spawnl(P_WAIT, "Int_main.exe", argv[0], parametro, NULL);
if (result == -1)
{
perror("Error from spawnl");
getch();
exit(1);
}
else
printf("\nValore di ritorno : %i\n", result);
}
} while(digit[0] != '0' );
return 0;
}



Originariamente inviato da Ikitt
...
void main() -> pre standard, discutibile, i compilatori lo fanno ancora passare ma sarebbe deprecato
...

Quoto :yuppi:

anx721
04-11-2005, 01:09
Tra l'altro no vale il discorso che il mai è la funzione principale e non lo chiama nessuno: il valore restituito dal main viene acquisito dal runtime, ad esempio se avvii un programma in windows che si conclude con

return -10;

alla fine del programma sulla console è scritto:

Terminated with return code -10
Press any key to continue ...

ovvero il valore di ritorno viene comunicato all'esterno del programma e può esere utilizzato da chi ha invocato il programma

LeleFT
04-11-2005, 11:55
E non è vero che non si possa richiamare il main:


#include <stdio.h>

char arr[] = "Hello World!";
int var = 11;
int main(a) {
if (a-13) {
putchar(arr[a-1]);
main(a+1);
}
return 0;
}

Ciao. :ciauz:

XWolverineX
04-11-2005, 15:23
Grazie mille, ora il concetto mi è chiaro.
Il valore di ritorno del main può essere utilizzato anche da altri programmi.
Credevo che il ritorno era una funzionaità interna del C!!
Thank you

Samuele_70
04-11-2005, 20:32
Giusto per riattizzare la discussione, visto che siamo in tema.
Chi conosce la differenza fra :


int main()
{
...
return 1;
}

..e..


int main()
{
...
exit(1);
}

... Differenze a livello di valore restituito naturalmente... :master:

Loading