Er det en forskjell mellom foo (void) og foo () i C ++ eller C?

stemmer
214

Vurder disse to funksjonsdefinisjoner:

void foo() { }

void foo(void) { }

Er det noen forskjell mellom disse to? Hvis ikke, hvorfor er det voidargumentet der? Estetiske grunner?

Publisert på 09/09/2008 klokken 00:48
kilden bruker
På andre språk...                            


4 svar

stemmer
2

I C, bruker du et tomrom i en tom funksjon referanse, slik at kompilatoren har en prototype, og at prototypen har "ingen argumenter". I C ++, trenger du ikke å fortelle kompilatoren at du har en prototype fordi du ikke kan la ut prototypen.

Svarte 09/09/2008 kl. 00:53
kilden bruker

stemmer
33

Jeg skjønner spørsmålet ditt gjelder C ++, men når det kommer til C svaret kan finnes i K & R, sider 72-73:

Videre, hvis en funksjon erklæring inkluderer ikke argumenter, som i

double atof();

som også menes at ingenting er å bli antatt på argumentene til atof; alt para kontroll er slått av. Denne spesielle betydningen av den tomme argument Listen er ment å tillate eldre C-programmer for å kompilere med nye kompilatorer. Men det er en dårlig idé å bruke den med nye programmer. Hvis funksjonen tar argumenter, erklære dem; hvis det tar ingen argumenter, bruker annullert.

Svarte 09/09/2008 kl. 00:55
kilden bruker

stemmer
279

I C :

  • void foo()betyr "en funksjon footar et uspesifisert antall argumenter av uspesifisert type"
  • void foo(void)betyr "en funksjon footar ingen argumenter"

I C ++ :

  • void foo()betyr "en funksjon footar ingen argumenter"
  • void foo(void)betyr "en funksjon footar ingen argumenter"

Ved å skrive foo(void), derfor oppnår vi det samme tolkning på tvers av både språk og gjøre vår overskrifter flerspråklig (selv om vi vanligvis trenger å gjøre noen flere ting til overskrifter for å gjøre dem virkelig cross-språk, nemlig pakk dem i en extern "C"hvis vi kompilering C ++).

Svarte 09/09/2008 kl. 01:34
kilden bruker

stemmer
5

C ++ 11 N3337 standard utkast

Det er ingen forskjell.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Vedlegg C "Compatibility" C.1.7 paragraf 8: declarators sier:

8.3.5 forandring: I C ++, en funksjon som er definert med en tom parameterliste tar ingen argumenter. I C, en tom parameterliste betyr at antallet og typen av de funksjons argumentene er ukjent.

Eksempel:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

Begrunnelse: Dette er for å unngå feilaktige funksjonskall (dvs. kaller funksjonen med feil antall eller type argumenter).

Effekt på opprinnelige funksjon: Bytt til semantikk veldefinert funksjon. Denne funksjonen ble merket som “obsolescent” i C.

8.5.3 funksjoner sier:

4. Parameter-deklarasjonen-leddet bestemmer de argumenter som kan spesifiseres, og deres behandling, når funksjonen kalles. [...] Hvis parameter-deklarasjonen-leddet er tom, tar funksjonen ingen argumenter. Parameterlisten (void) er ekvivalent med den tomme parameterlisten.

C99

Som nevnt av C ++ 11, int f()spesifiserer ingenting om argumentene, og er foreldede.

Det kan enten føre til arbeids kode eller UB.

Jeg har tolket C99 standard i detalj på: https://stackoverflow.com/a/36292431/895245

Svarte 25/04/2016 kl. 08:20
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more