Avatar billede kjeldsted Novice
28. marts 2012 - 21:10 Der er 11 kommentarer og
1 løsning

main() void eller int?

Hejsa.
Et hurtigt (formodentlig) simpelt spørgsmål. Jeg er gået i gang med at læse på C++, efter at have programmeret PHP i nogle år. Jeg har skaffet mig nogle bøger jeg er ved at gnave mig igennem, men disse to bøger er lidt modstridende. I den eneste var noget af det første jeg læste at main() aldrig må være void idet styresystemet forventer et svar fra programmet. I den anden bog er de dog rigtig glade for at benytte void til main() i stedet for int med en return 0;

Hvad er det helt korrekte?

På forhånd tak :)
Avatar billede arne_v Ekspert
28. marts 2012 - 21:40 #1
int
Avatar billede arne_v Ekspert
28. marts 2012 - 21:42 #2
main skal returnere en int som saettes som status til shell saaledes at hvis programmet koeres af et shell script saa kan der testes paa om der opstod en fejl eller ej

der er mange aars tradition for at sjuskede C og C++ udviklere og endda visse forfattere erklaerer main som void

men du behoever ikke tilslutte dig den skare
Avatar billede Wally1973 Praktikant
28. marts 2012 - 21:51 #3
Det afhænger af hvordan du behandler fejlmeddelelser i dit program.
Behandles fejlmeddelelserne internt, så er der ingen grund til at smide noget tilbage via main-funktionen, f.eks. kan det være via popups af vinduer med fejlmeddelelser eller en direkte fejl-log.
Skal fejlmeddelelser behandles eksternt, så er en retur-værdi via main-funktionen en mulighed.

Svar #2 ser lidt ensidigt ud, da synspunktet lader til kun at være shell-scripts, men C/C++ kan alt muligt andet også.
Avatar billede arne_v Ekspert
28. marts 2012 - 22:12 #4
nej - void main er ikke korrekt C++ - det skal vaere int main

uanset om man skal bruge den retur vaerdi eller ej

hvis man skal bruge retur varedien vil det typisk vaere i et shell script, men det kan ogsaa vaere hvis det startes fra et andet program
Avatar billede arne_v Ekspert
28. marts 2012 - 22:15 #5
Avatar billede kjeldsted Novice
28. marts 2012 - 22:17 #6
#1 Kort og konstant svar. Det kan vi lide!

Jeg har også i helhed mest tillid til forfatteren der meget bestemt skrev at det er en fejl at angive main som void. Så jeg holder mig bare til at definere main som int med return 0.

#3:
I den bog hvor de lystigt angiver main som void (desuden en Windows programmeringsbog) skriver han at int KAN benyttes til at fortælle Windows om programmet har udført en fejl. Men eftersom den anden forfatter virker meget sikker på at mail ALTID skal defineres som int, samtidig med at arne_v også ser ud at have denne mening, så vil jeg som sagt nok bare holde mig til dette :)

Arne_v: Smid et svar!
Avatar billede kjeldsted Novice
28. marts 2012 - 22:20 #7
Og desuden mange tak for hjælpen arne_v. Nu er jeg da et skridt nærmere god programmeringsskik.
Avatar billede arne_v Ekspert
28. marts 2012 - 22:23 #8
svar
Avatar billede arne_v Ekspert
29. marts 2012 - 03:20 #9
Eller som de formulerer det i C++ standarden:

2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return
type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following
definitions of main :
int main() { / ... / }
and
int main(int argc, char* argv[]) { / ... / }
In the latter form argc shall be the number of arguments passed to the program from the environment in which the
program is run. If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to
the initial characters of null-terminated multibyte strings (NTMBSs) (17.3.2.1.3.2) and argv[0] shall be the pointer to
the initial character of a NTMBS that represents the name used to invoke the program or "". The value of argc shall be
nonnegative. The value of argv[argc] shall be 0. [ Note: it is recommended that any further (optional) parameters be
added after argv. —end note ]
Avatar billede Wally1973 Praktikant
29. marts 2012 - 05:55 #10
Fik lige læst standarderne igennem og C++ tillader faktisk ikke void.
Jeg troede faktisk at det var tilladt.
Jeg startede med C, hvor det er tilladt og det er også tilladt i C#, og faktisk også praktisk talt alle de andre sprog, bare ikke C++. :)
Avatar billede arne_v Ekspert
30. marts 2012 - 03:49 #11
C89 og C99 tillader andre signaturer i environments uden OS

C99 tillader ekstra signaturer for main i environments med OS hvis compiler producenten har dokumenteret saadanne.

5.1.2.1 Freestanding environment
1 In a freestanding environment (in which C program execution may take place without any
benefit of an operating system), the name and type of the function called at program
startup are implementation-defined. Any library facilities available to a freestanding
program, other than the minimal set required by clause 4, are implementation-defined.
2 The effect of program termination in a freestanding environment is implementationdefined.
5.1.2.2 Hosted environment
1 A hosted environment need not be provided, but shall conform to the following
specifications if present.
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent;8) or in some other implementation-defined manner.

Oensker man at skrive portabel C kode skal main vaere int.

Fra C FAQ:

http://c-faq.com/ansi/voidmain.html
Avatar billede arne_v Ekspert
30. marts 2012 - 03:54 #12
C# tillader baade int og void omend void er det som normalt bruges.

Java kraever at den er void.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester