Functiedefinitie K & R-stijl compileren met behulp van g ++

Bij het compileren van een c-bestand dat de functie-definitie van de oude stijl gebruikt

int foo(a)
   int a;
{
  ...
}

g ++ geeft en foutmelding: 'a' is niet binnen deze scope gedeclareerd. gcc kan dit ontleden. Is er een manier om g ++ dit te laten herkennen?

Dit komt als een probleem voor me omdat ik een mix van c- en c ++ -bestanden aan het samenstellen ben. Een gerelateerde vraag is wat de standaardpraktijk is van het bouwen van dit type gemengde bron? Gebruikt u g ++ voor alle bestanden of alleen voor de cc-bestanden? De eerste is handig maar blijft me wat problemen geven vanwege de inconsistenties tussen de c- en c ++ -specificatie (bijvoorbeeld char [4] = "four";)

1
@kay: er zijn eigenlijk heel veel gebroken code nog steeds met K & R-functiedefinities. Het meeste is in oude BSD- of Sun-afgeleide software; sommige oude GNU-software heeft het ook.
toegevoegd de auteur R.., de bron
Hey guys, kun je ook voorstellen hoe je g + + compileert PHP ??
toegevoegd de auteur ta.speot.is, de bron
Gebruik je echt nog steeds code die sinds 1989 niet is aangeraakt?
toegevoegd de auteur key, de bron

3 antwoord

Is er een manier om g ++ dit te laten herkennen?

Deze syntaxis wordt niet ondersteund in C ++.

g ++ uitvoeren op alle bestanden of alleen de cc-bestanden?

Zie b.v. C ++ -programma's compileren uit de GCC-documenten:

C ++ bronbestanden gebruiken conventioneel een van de achtervoegsels .C ', .cc, .cpp, .CPP, .c ++, .cp of .cxx; C ++ header-bestanden gebruiken vaak .hh, .hpp, .H of (voor gedeelde sjablooncode) .tcc; en voorverwerkte C ++ -bestanden gebruiken het achtervoegsel .ii. GCC herkent bestanden met deze namen en compileert ze als C ++ -programma's, zelfs als u de compiler op dezelfde manier oproept als voor het compileren van C-programma's (meestal met de naam gcc ).

     

Het gebruik van gcc voegt echter niet de C ++ -bibliotheek toe. g ++ is een programma dat GCC aanroept en .c-, .h- en .i-bestanden behandelt als C ++ bronbestanden in plaats van C-bronbestanden, tenzij -x wordt gebruikt en automatisch opgeeft koppeling met de C ++ -bibliotheek. Dit programma is ook handig bij het voorcompileren van een C-headerbestand met een .h-extensie voor gebruik in C ++ -compilaties.

Dus twee mogelijkheden:

  1. Voer gcc uit op C-bestanden en g ++ op C ++ -bestanden.
  2. Voer gcc uit voor alle bestanden.

In beide gevallen moet u linken met g ++ (of gcc -lstdc ++ ).

11
toegevoegd
Er kan niet genoeg benadrukt worden dat C-code geen C ++ is en u het niet kunt compileren met een C ++ -compiler . Zelfs als het compileren slaagt, is dat geen garantie dat de code zich zal gedragen zoals verwacht; er zijn veel gevallen waarin dezelfde code verschillende semantieken heeft in C versus C ++. De enige manier om C te compileren met een C ++ - compiler is als je weet dat de code is geschreven in de (erg lelijke) taal die de kruising is tussen C en C ++. Omdat OP te maken heeft met code met K & R-functiedefinities, zit het zeker niet in die klasse.
toegevoegd de auteur R.., de bron
Om uit te werken - als je een C ++ - compiler gebruikt, moet je C ++ - code compileren. Niet alle C-codes zijn legale C ++-codes.
toegevoegd de auteur templatetypedef, de bron
Het verschil in bijna geen verschil is eigenlijk vrij belangrijk. Bij het compileren zal de uitvoerbare g ++ C ++ -taal dwingen, terwijl de uitvoerbare gcc de taal zal beslissen op basis van de extensie van het bestand (dat wil zeggen dat het C en C ++ kan compileren). Bij het aanroepen van de linker. Dat wil zeggen, het antwoord op de vraag is dat als hij in plaats van altijd g ++ moet aanroepen, hij gcc moet aanroepen en de linkeropdracht moet wijzigen.
toegevoegd de auteur David Rodríguez - dribeas, de bron

Oli heeft gelijk: C ++ ondersteunt geen oude stijldefinities.

Compileer C met een C-compiler (zoals gcc).

Compileer C ++ met een C ++ -compiler (zoals g ++).

Het zijn twee verschillende (hoewel nauw verwante) talen. U kunt de functie extern "C" van C ++ gebruiken om C-code vanuit C ++ op te roepen en omgekeerd; zie sectie 32 van de C ++ FAQ Lite voor meer informatie.

4
toegevoegd
+1 voor extern "C"
toegevoegd de auteur bitmask, de bron

Als je zowel C als C ++ gaat compileren, kun je beter altijd met gcc compileren (het kiest de taal op basis van de bestandsextensie) dan g ++ (zal altijd compileren als C ++). U moet uw linkeropties wijzigen in C ++ standaardbibliotheek (en -lm als u deze gebruikt), omdat deze automatisch worden toegevoegd door g ++ maar niet gcc .

Als alternatief is een betere optie om de g ++ voor C ++ en gcc voor C-bestanden aan te roepen. Dat moet niet te moeilijk zijn om te beheren door het buildsysteem te configureren.

2
toegevoegd
U kunt g ++ alleen gebruiken voor linken, en gcc voor het compileren ...
toegevoegd de auteur R.., de bron