[C] Waarom is main integer, als het niks retourneert?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
Ik ben op dit moment bezig met een tutorial in C. Waar ik echter nog geen antwoord op kon vinden, is het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

void playgame()
{
    printf( "Play game called" );
}
void loadgame()
{
    printf( "Load game called" );
}
void playmultiplayer()
{
    printf( "Play multiplayer game called" );
}
    
int main()
{
    int input;

    printf( "1. Play game\n" );
    printf( "2. Load game\n" );
    printf( "3. Play multiplayer\n" );
    printf( "4. Exit\n" );
    printf( "Selection: " );
    scanf( "%d", &input );
    switch ( input ) {
        case 1:            /* Note the colon, not a semicolon */
            playgame();
            break;
        case 2:          
            loadgame();
            break;
        case 3:         
            playmultiplayer();
            break;
        case 4:        
            printf( "Thanks for playing!\n" );
            break;
        default:            
            printf( "Bad input, quitting!\n" );
            break;
    }
    getchar();

}


Zo te zien, retourneert de main-functie geen 0. Alleen een getchar op het eind.

Dan vraag ik mij af waarom de main als int gedeclareerd wordt, in plaats van als `void`? Daar kon ik verder weinig over vinden op internet.

Beste antwoord (via Hatsieflatsie op 23-05-2016 00:57)


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Hatsieflatsie schreef op zondag 22 mei 2016 @ 21:51:

Zo te zien, retourneert de main-functie geen 0. Alleen een getchar op het eind.
Als je aan het einde van main() komt zonder een explicite return, dan is de return waarde impliciet 0 (sinds C99).

Voor andere functies geldt dat in dat geval het resultaat ongedefinieerd is.
Dan vraag ik mij af waarom de main als int gedeclareerd wordt, in plaats van als `void`? Daar kon ik verder weinig over vinden op internet.
Omdat main dedefinieerd is als zijnde een functie die int returned met nul of twee argumenten. Aldus de standaard. (M.u.v. een zgn 'freestanding environment', waarin je geen OS hebt en dus returnwaarde dus niks doet; daar kan void main() wel as 't van de compiler mag.)

main() als void declareren levert je een compiler warning op:

$ gcc -o test test.c
test.c:1:1: warning: return type of 'main' is not 'int' [-Wmain-return-type]
void main(){
^
test.c:1:1: note: change return type to 'int'
void main(){
^~~~
int
1 warning generated.


met inderdaad een ongedefinieerd resultaat:

$ ./test 
$ echo $?
176


Terwijl int main() geen warnings produceert met het correcte resultaat:

$ ./test 
$ echo $?
0


Dit alles met een lege main alzo
$ cat test.c 
int main(){
}

All my posts are provided as-is. They come with NO WARRANTY at all.

Alle reacties


Acties:
  • +3 Henk 'm!

  • Oyster
  • Registratie: Januari 2003
  • Niet online

Oyster

Prince

Main is de enige functie waarbij een return value niet expliciet gedefinieerd hoeft te worden. Daarbij wordt de return value doorgegeven aan het besturingssysteem. Wat deze waarde is hangt af van je programma. Over het algemeen is 0 de waarde wanneer een programma zonder problemen exit.

Acties:
  • +2 Henk 'm!

  • L01
  • Registratie: December 2003
  • Laatst online: 10:52

L01

Eens met Oyster. Deze waardes worden ook wel exit codes genoemd:

Wikipedia: Exit status

Hi, I'm a signature virus. Put me in your signature to help me spread.


Acties:
  • +3 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 11-10 19:53

Ventieldopje

I'm not your pal, mate!

De exit code is belangrijk om voor andere programma's / besturingssysteem te weten of je programma zonder fouten is gestopt. Aan de exit code kun je dan tevens ook zien waar het fout is gegaan als je verschillende exit codes voor verschillende fouten hanteerd.

In veel shells (unix/mac/linux) kun je de statuscode van de laatste applicatie opvragen met $? :)

[ Voor 16% gewijzigd door Ventieldopje op 22-05-2016 22:18 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
Ventieldopje schreef op zondag 22 mei 2016 @ 22:17:
In veel shells (unix/mac/linux) kun je de statuscode van de laatste applicatie opvragen met $? :)
Interessant, dus ik neem aan dat het volgende correct is? :

code:
1
gcc $?


Deze geeft de statuscode echter niet weer.

Acties:
  • 0 Henk 'm!

  • TommyboyNL
  • Registratie: Januari 2006
  • Niet online
Probeer eens "echo $?"

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 11-10 19:53

Ventieldopje

I'm not your pal, mate!

Hatsieflatsie schreef op zondag 22 mei 2016 @ 22:29:
[...]

Interessant, dus ik neem aan dat het volgende correct is? :

code:
1
gcc $?


Deze geeft de statuscode echter niet weer.
Nee, tenzij je de exit code van het vorige commando mee wil geven aan GCC als input file, lijkt me stug ;)

Probeer dit:

code:
1
2
$ gcc main.c 
$ echo $?


of:

code:
1
gcc main.c && echo $?

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • Beste antwoord
  • +5 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Hatsieflatsie schreef op zondag 22 mei 2016 @ 21:51:

Zo te zien, retourneert de main-functie geen 0. Alleen een getchar op het eind.
Als je aan het einde van main() komt zonder een explicite return, dan is de return waarde impliciet 0 (sinds C99).

Voor andere functies geldt dat in dat geval het resultaat ongedefinieerd is.
Dan vraag ik mij af waarom de main als int gedeclareerd wordt, in plaats van als `void`? Daar kon ik verder weinig over vinden op internet.
Omdat main dedefinieerd is als zijnde een functie die int returned met nul of twee argumenten. Aldus de standaard. (M.u.v. een zgn 'freestanding environment', waarin je geen OS hebt en dus returnwaarde dus niks doet; daar kan void main() wel as 't van de compiler mag.)

main() als void declareren levert je een compiler warning op:

$ gcc -o test test.c
test.c:1:1: warning: return type of 'main' is not 'int' [-Wmain-return-type]
void main(){
^
test.c:1:1: note: change return type to 'int'
void main(){
^~~~
int
1 warning generated.


met inderdaad een ongedefinieerd resultaat:

$ ./test 
$ echo $?
176


Terwijl int main() geen warnings produceert met het correcte resultaat:

$ ./test 
$ echo $?
0


Dit alles met een lege main alzo
$ cat test.c 
int main(){
}

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
CyBeR schreef op maandag 23 mei 2016 @ 00:55:
[...]
main() als void declareren levert je een compiler warning op:
Ben je hier zeker van? Als ik main als void declareer, krijg ik met de gcc geen compiler warning. Hij compileert hem namelijk gewoon.

[ Voor 44% gewijzigd door Hatsieflatsie op 23-05-2016 01:09 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-10 22:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Compile je wel in C99 mode?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Hatsieflatsie schreef op maandag 23 mei 2016 @ 01:09:
[...]

Ben je hier zeker van? Als ik main als void declareer, krijg ik met de gcc geen compiler warning. Hij compileert hem namelijk gewoon.
gcc laat standaard wat minder warnings zien, ik gebruik hier in werkelijkheid llvm (clang) en die is standaard wat verboser.

Als je compilet met warnings (zoals je dat altijd zou moeten doen), krijg je met gcc ook gewoon een warning:

$ gcc -o test test.c
$ gcc -Wall -o test test.c
test.c:1:6: warning: return type of 'main' is not 'int' [-Wmain]
 void main(){
      ^


Hij compilet 'm overigens in beide gevallen -- warnings staan compilatie op zich niet in de weg. Je hebt alleen een wat grotere kans op een niet correct functionerend programma :P

[ Voor 14% gewijzigd door CyBeR op 23-05-2016 02:22 . Reden: fancy quotes ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:26
Klein detail.

De echo wordt alleen uitgevoerd als de exit code van het gcc main.c 0 is. Dus ofwel, je ziet 0 als uitkomst ofwel je ziet niks omdat de echo niet uitgevoerd wordt.

Oftewel:
- een && stopt zodra het commando ervoor geen exit code 0 heeft.
- een || gaat alleen door wanneer het commando geen exit code 0 heeft.

Voorbeeld 1:
code:
1
2
3
int main(void) {
        return 1;
}


code:
1
cc -o test test.c


code:
1
2
3
# ./test && echo $?
# ./test || echo $?
255


Voorbeeld 2:
code:
1
2
3
int main(void) {
        return 0;
}


code:
1
cc -o test test.c


code:
1
2
3
# ./test && echo $?
0
# ./test || echo $?


http://unix.stackexchange...rror-255-when-returning-1

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
Hoe zou ik dat kunnen vaststellen?

code:
1
gcc -v
geeft mij het volgende:

ReneFroger@PackardBell-x486:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.3.1-14ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) 


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:26
Ik krijg hier ook geen foutmelding bij gcc 4.8. Je kan natuurlijk ook altijd (vrijwel) alle foutmeldingen expliciet aanzetten:
code:
1
2
3
4
# gcc -Wall test.c
test.c:1:6: warning: return type of 'main' is not 'int' [-Wmain]
 void main(void) {
      ^

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
CurlyMo schreef op maandag 23 mei 2016 @ 10:23:
Ik krijg hier ook geen foutmelding bij gcc 4.8. Je kan natuurlijk ook altijd (vrijwel) alle foutmeldingen expliciet aanzetten:
code:
1
2
3
4
# gcc -Wall test.c
test.c:1:6: warning: return type of 'main' is not 'int' [-Wmain]
 void main(void) {
      ^
Dat klopt, dat Wall flag merkte ik op in de post van CyBeR. Wat ik weer niet begrijp, is dat in z'n command line opdracht ik geen flag (of noem je dat een parameter?) '-Wall' erbij zie staan, terwijl we dezelfde gcc compiler gebruiken.

Gcc is toch een andere compiler dan Clang, terwijl CyBer in z'n latere posts aangeeft Clang te gebruiken.

[ Voor 16% gewijzigd door Hatsieflatsie op 23-05-2016 10:27 ]


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:26
gcc is meestal een symlink naar een specifieke compiler (versie).
code:
1
2
3
4
# whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/bin/X11/gcc /usr/share/man/man1/gcc.1.gz
# ls -Al /usr/bin/gcc
lrwxrwxrwx 1 root root 7 Apr  8  2014 /usr/bin/gcc -> gcc-4.8


Zo kan gcc ook linken naar clang. Puur om makkelijk bestaande build scripts te kunnen gebruiken.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-10 22:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hatsieflatsie schreef op maandag 23 mei 2016 @ 10:21:
[...]

Hoe zou ik dat kunnen vaststellen?
Als je geen -std=c99 meegeeft dan doe je dat dus niet ;). Maar ik zie dat dit weinig uithaalt. Het is blijkbaar gewoon geen error in C. In C++ wel.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 10:38
In een microcontroller keert main niet terug, immers eindigt je applicatie daar nooit. Je kunt de compiler vertellen dat dit zo is via: __attribute__ ((noreturn)).
Maar dat heeft alleen nadelen in een OS-omgeving.

Acties:
  • +1 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Uiteindelijk komt het er op neer dat het een vergissing is uit het verleden dat niet meer fatsoenlijk gerepareerd kan worden omdat er triljoenen regels C zijn die dan kapot zouden gaan. Men had dit gewoon in de eerste standaard al vast moeten leggen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
farlane schreef op maandag 23 mei 2016 @ 11:48:
Uiteindelijk komt het er op neer dat het een vergissing is uit het verleden dat niet meer fatsoenlijk gerepareerd kan worden omdat er triljoenen regels C zijn die dan kapot zouden gaan. Men had dit gewoon in de eerste standaard al vast moeten leggen.
Hoezo is dat een vergissing uit het verleden? Er is later ergens rond 1999 in 99 standaard toegevoegd dat een main() standaard een int is, ongeacht of het daadwerkelijk iets retourneert. C bestond toen al dik 30 jaar.

[ Voor 6% gewijzigd door Hatsieflatsie op 23-05-2016 12:54 ]


Acties:
  • 0 Henk 'm!

  • onetime
  • Registratie: Augustus 2006
  • Niet online
farlane schreef op maandag 23 mei 2016 @ 11:48:
Uiteindelijk komt het er op neer dat het een vergissing is uit het verleden dat niet meer fatsoenlijk gerepareerd kan worden omdat er triljoenen regels C zijn die dan kapot zouden gaan. Men had dit gewoon in de eerste standaard al vast moeten leggen.
Lees de reactie van Oyster, L01 en Ventieldopje eens... Helemaal aan het begin. Daar staat het al uitgelegd.

I Bought Myself A Politician - MonaLisa Twins 2013: 7panelen(195Wp), maand later, 17. 3 jaar later 28 en gasloos. 5.5kWp O-W op 4.2kVA omvormer. 2018 'verhuisd'.


Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Het is dat je geen loop gebruikt voor verkeerde input, anders was dit gebeurd:

http://www.giannistsakiri...ou-should-avoid-using-it/

Nadeeltje van scanf :) Gebruik ook nooit getchar() om daadwerkelijk iets in te lezen.

Voor de rest zou je bij "bad input" dus -1 kunnen retourneren :) Daar is het voor. Zodat andere programma's / scripts die jouw programma gebruiken een return waarde krijgen. Vaak is 0 dan success, en iets anders foute boel.

Je zou ook kunnen zeggen: een programma moet altijd een exit code geven, en in C is dat by default 0. Ook al doe je geen return.

[ Voor 55% gewijzigd door Lethalis op 23-05-2016 15:38 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • +2 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-10 22:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hatsieflatsie schreef op maandag 23 mei 2016 @ 12:49:
[...]

Hoezo is dat een vergissing uit het verleden? Er is later ergens rond 1999 in 99 standaard toegevoegd dat een main() standaard een int is, ongeacht of het daadwerkelijk iets retourneert. C bestond toen al dik 30 jaar.
onetime schreef op maandag 23 mei 2016 @ 15:16:
[...]

Lees de reactie van Oyster, L01 en Ventieldopje eens... Helemaal aan het begin. Daar staat het al uitgelegd.
Volgens mij interpreteren jullie beide de opmerking van farlane verkeerd.

Is het essentieel dat main() een int returnt? In mijn opzicht wel, want main() bepaalt de exit-code van je applicatie (als je returnt uit main() iig, je kunt natuurlijk ook een exit() doen). De typische library call rond main is als volgt:
C:
1
exit(main(argc, argv));

main() moet dus een int returnen om bovenstaande te laten werken.

De vergissing waar farlane het over heeft is dat vóór C99 het returntype van main niet gespecificeerd was. Nu is hij dat wel, maar dat is een breaking change - als je vereist dat main() een int returnt, zal veel oude code niet meer compilen. Er is dus bewust voor gekozen om geen error te geven als main() geen int returnt. Ook is er bewust voor gekozen dat als hij toch een int retunt, maar er geen expliciete waarde wordt gereturnd, hij alsnog 0 returnt.

Overigens, ookal is C in 1969 bedacht, hij is pas in 1989/1990 formeel gestandaardiseerd bij resp. ANSI en ISO. Zeggen dat het dus al zo lang bestond vind ik wat kort door de bocht, omdat het voor 1989 geen formele specificatie kende. De fout dat main() geen int hoeft te returnen is wat dat betreft ook pas gemaakt bij het opstellen van die formele specificatie in de jaren '80.

[ Voor 11% gewijzigd door .oisyn op 23-05-2016 15:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • +1 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-10 14:49
Wat .oisyn zegt dus. Alleen hij doet het beter :P

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
.oisyn schreef op maandag 23 mei 2016 @ 10:34:
[...]

Als je geen -std=c99 meegeeft dan doe je dat dus niet ;). Maar ik zie dat dit weinig uithaalt. Het is blijkbaar gewoon geen error in C. In C++ wel.
Met GCC? In C++ krijg ik vreemd genoeg ook geen foutmelding met dezelfde code:

$ gcc -o test.a test.cpp
$ gcc -Wall -o test.a test.cpp
$ 

[ Voor 7% gewijzigd door Hatsieflatsie op 24-05-2016 17:22 ]


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:26
Hatsieflatsie schreef op dinsdag 24 mei 2016 @ 17:18:
[...]

Met GCC? In C++ krijg ik vreemd genoeg ook geen foutmelding met dezelfde code:
Dit is nog steeds gewoon C. Voor C++ gebruik je de G++ compiler. Los van of je je bestanden cpp noemt.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
CurlyMo schreef op dinsdag 24 mei 2016 @ 17:31:
[...]

Dit is nog steeds gewoon C. Voor C++ gebruik je de G++ compiler. Los van of je je bestanden cpp noemt.
$ g++ -o test.a test.cpp
$ g++ -Wall -o test.a test.cpp
$ 

Enige tips waar ik verkeerd doe?

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Hatsieflatsie schreef op dinsdag 24 mei 2016 @ 17:18:
[...]

Met GCC? In C++ krijg ik vreemd genoeg ook geen foutmelding met dezelfde code:

$ gcc -o test.a test.cpp
$ gcc -Wall -o test.a test.cpp
$ 
Zeker (deze keer met gnu g++ ipv llvm:)

$ g++ -o test++ test.c
test.c:1:11: error: '::main' must return 'int'
 void main(){

[ Voor 5% gewijzigd door CyBeR op 24-05-2016 17:37 . Reden: fucking fancy quotes ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Hatsieflatsie
  • Registratie: Oktober 2011
  • Laatst online: 09-10 09:52
CyBeR schreef op dinsdag 24 mei 2016 @ 17:35:
[...]


Zeker (deze keer met echte g++:)
$ g++ -o test++ test.c
test.c:1:11: error: &#8216;::main&#8217; must return &#8216;int&#8217;
 void main(){
Daarin wordt de main() als void gecast, terwijl het in de code en waar het hier (volgens mij?) om gaat, is dat de main() integer is, terwijl het niks retourneert.

Volgens anderen zou het in C++ een foutmelding opleveren, daar je de return expliciet moet aangeven. Ik krijg met g++ geen foutmelding, ook niet met -Wall van dezelfde code met int main(), zonder dat er iets geretourneerd wordt?

[ Voor 20% gewijzigd door Hatsieflatsie op 24-05-2016 17:40 ]


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 11:26
Hatsieflatsie schreef op dinsdag 24 mei 2016 @ 17:38:
[...]

Daarin wordt de main() als void gecast, terwijl het in de code en waar het hier (volgens mij?) om gaat, is dat de main() integer is, terwijl het niks retourneert.

Volgens anderen zou het in C++ een foutmelding opleveren, daar je de return expliciet moet aangeven. Ik krijg met g++ geen foutmelding, ook niet met -Wall van dezelfde code met int main(), zonder dat er iets geretourneerd wordt?
Die fout zou je moeten zien bij de -Wall zie: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Anders kan je proberen expliciet -Wreturn-type te gebruiken.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-10 22:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat een error is is dat main() een int moet zijn, niet dat je per se een return statement moet gebruiken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Hatsieflatsie schreef op dinsdag 24 mei 2016 @ 17:38:
[...]

Daarin wordt de main() als void gecast, terwijl het in de code en waar het hier (volgens mij?) om gaat, is dat de main() integer is, terwijl het niks retourneert.

Volgens anderen zou het in C++ een foutmelding opleveren, daar je de return expliciet moet aangeven. Ik krijg met g++ geen foutmelding, ook niet met -Wall van dezelfde code met int main(), zonder dat er iets geretourneerd wordt?
Nee, dat gaat over dat main een int return type moet hebben. De '0' return bij main() is ook in C++ impliciet indien niet expliciet gedaan.

All my posts are provided as-is. They come with NO WARRANTY at all.

Pagina: 1