C LanguageAan de slag met C Language


Opmerkingen

C is een algemene, imperatieve computerprogrammeertaal, die gestructureerd programmeren, lexicale variabele reikwijdte en recursie ondersteunt, terwijl een statisch type systeem veel onbedoelde bewerkingen voorkomt. Door het ontwerp levert C constructies die efficiënt worden gekoppeld aan typische machine-instructies, en daarom heeft het langdurig gebruik gevonden in applicaties die voorheen waren gecodeerd in assembleertaal, inclusief besturingssystemen, evenals verschillende applicatiesoftware voor computers variërend van supercomputers tot embedded systemen .

Ondanks de lage mogelijkheden, werd de taal ontworpen om platformoverschrijdend programmeren te stimuleren. Een normconform en draagbaar geschreven C-programma kan worden samengesteld voor een zeer breed scala aan computerplatforms en besturingssystemen met weinig wijzigingen in de broncode. De taal is beschikbaar geworden op een zeer breed scala aan platforms, van ingebedde microcontrollers tot supercomputers.

C werd oorspronkelijk ontwikkeld door Dennis Ritchie tussen 1969 en 1973 bij Bell Labs en werd gebruikt om de Unix- besturingssystemen opnieuw te implementeren. Het is sindsdien een van de meest gebruikte programmeertalen aller tijden geworden, met C-compilers van verschillende leveranciers beschikbaar voor de meeste bestaande computerarchitecturen en besturingssystemen.

Gemeenschappelijke compilers

Het proces om een C-programma te compileren verschilt tussen compilers en besturingssystemen. De meeste besturingssystemen worden zonder compiler geleverd, dus u moet er een installeren. Enkele veelvoorkomende compilerskeuzes zijn:

De volgende documenten zouden u een goed overzicht moeten geven van hoe u aan de slag kunt gaan met enkele van de meest voorkomende compilers:

Compiler C-versie Ondersteuning

Merk op dat compilers verschillende ondersteuningsniveaus hebben voor standaard C, terwijl veel C99 nog steeds niet volledig worden ondersteund. Vanaf de 2015-release bijvoorbeeld, ondersteunt MSVC veel van C99, maar heeft nog steeds enkele belangrijke uitzonderingen voor ondersteuning van de taal zelf (bijvoorbeeld de voorbewerking lijkt niet-conform) en voor de C-bibliotheek (bijvoorbeeld <tgmath.h> ), noch documenteren ze noodzakelijkerwijs hun "implementatie-afhankelijke keuzes". Wikipedia heeft een tabel met ondersteuning die wordt aangeboden door enkele populaire compilers.

Sommige compilers (met name GCC) hebben aangeboden, of blijven bieden, compiler extensies die extra functies die de compiler producenten nodig, nuttig achten uit te voeren of te geloven kan deel uitmaken van een toekomstige C-versie geworden, maar dat op dit moment niet deel uit van een C-norm. Omdat deze extensies specifiek zijn voor de compiler, kunnen ze als niet-compatibel worden beschouwd en kunnen ontwikkelaars van compiler ze in latere compilerversies verwijderen of wijzigen. Het gebruik van dergelijke uitbreidingen kan in het algemeen worden gecontroleerd door compileervlaggen.

Bovendien hebben veel ontwikkelaars compilers die alleen specifieke versies van C ondersteunen die zijn opgelegd door de omgeving of het platform waarop ze zich richten.

Als u een compiler selecteert, wordt het aanbevolen om een compiler te kiezen die de beste ondersteuning biedt voor de nieuwste versie van C die is toegestaan voor de doelomgeving.

Codestijl (off-topic hier):

Omdat witruimte onbeduidend is in C (dat wil zeggen, dit heeft geen invloed op de werking van de code), gebruiken programmeurs vaak witruimte om de code beter leesbaar en begrijpelijk te maken, dit wordt de codestijl genoemd . Het is een set regels en richtlijnen die worden gebruikt bij het schrijven van de broncode. Het behandelt problemen zoals hoe lijnen moeten worden ingesprongen, of spaties of tabs moeten worden gebruikt, hoe accolades moeten worden geplaatst, hoe spaties moeten worden gebruikt rond operatoren en haakjes, hoe variabelen moeten worden benoemd, enzovoort.

Codestijl valt niet onder de norm en is in de eerste plaats gebaseerd op meningen (verschillende mensen vinden verschillende stijlen gemakkelijker te lezen), daarom wordt het over het algemeen als off-topic beschouwd op SO. Het belangrijkste advies over stijl in de eigen code is dat consistentie voorop staat - kies of maak een stijl en houd u eraan. Het volstaat om uit te leggen dat er verschillende stijlen worden gebruikt die vaak door programmeurs worden gekozen in plaats van hun eigen stijl te creëren.

Enkele veelvoorkomende inspringstijlen zijn: K & R-stijl, Allman-stijl, GNU-stijl enzovoort. Sommige van deze stijlen hebben verschillende varianten. Allman wordt bijvoorbeeld gebruikt als gewone Allman of de populaire variant, Allman-8. Informatie over enkele van de populaire stijlen is te vinden op Wikipedia . Zulke stijlnamen zijn ontleend aan de normen die de auteurs of organisaties vaak publiceren voor gebruik door de vele mensen die bijdragen aan hun code, zodat iedereen de code gemakkelijk kan lezen als hij de stijl kent, zoals de GNU-opmaakgids die deel uitmaakt van het document met GNU-coderingsnormen .

Enkele veel voorkomende naamgevingsconventies zijn: UpperCamelCase, LowerCamelCase, Lower_case_with_underscore, ALL_CAPS, enz. Deze stijlen worden op verschillende manieren gecombineerd voor gebruik met verschillende objecten en typen (macro's gebruiken bijvoorbeeld vaak de ALL_CAPS-stijl)

K & R-stijl wordt over het algemeen aanbevolen voor gebruik in SO-documentatie, terwijl de meer esoterische stijlen, zoals Pico, worden afgeraden.

Bibliotheken en API's die niet onder de C-standaard vallen (en daarom hier niet ter discussie staan):

versies

Versie Standaard Publicatie datum
K & R n / a 1978/02/22
C89 ANSI X3.159-1989 1989/12/14
C90 ISO / IEC 9899: 1990 1990/12/20
C95 ISO / IEC 9899 / AMD1: 1995 1995/03/30
C99 ISO / IEC 9899: 1999 1999/12/16
C11 ISO / IEC 9899: 2011 2011-12-15

Hallo Wereld

Om een eenvoudig C-programma te maken dat "Hallo, Wereld" op het scherm afdrukt, gebruikt u een teksteditor om een nieuw bestand te maken (bijv. hello.c - de bestandsextensie moet .c ) met de volgende broncode:

hello.c

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Live demo op Coliru

Laten we dit eenvoudige programma regel voor regel bekijken

#include <stdio.h>
 

Deze regel vertelt de compiler om de inhoud van het standaardbibliotheekkopbestand stdio.h in het programma op te nemen. Headers zijn meestal bestanden met functieverklaringen, macro's en gegevenstypen, en u moet het header-bestand opnemen voordat u ze gebruikt. Deze regel bevat stdio.h zodat deze de functie puts() kan aanroepen.

Meer informatie over kopteksten.

int main(void)
 

Deze regel start de definitie van een functie. Het vermeldt de naam van de functie ( main ), het type en aantal argumenten dat het verwacht ( void , wat geen betekent), en het type waarde dat deze functie retourneert ( int ). De uitvoering van het programma begint in de functie main() .

{
    …
}
 

De accolades worden in paren gebruikt om aan te geven waar een codeblok begint en eindigt. Ze kunnen op veel manieren worden gebruikt, maar in dit geval geven ze aan waar de functie begint en eindigt.

    puts("Hello, World");
 

Deze regel roept de functie puts() aan om tekst naar standaarduitvoer uit te voeren (standaard het scherm), gevolgd door een nieuwe regel. De string die moet worden uitgevoerd, staat tussen haakjes.

"Hello, World" is de tekenreeks die naar het scherm wordt geschreven. In C moet elke letterlijke tekenreekswaarde tussen de dubbele aanhalingstekens "…" .

Meer informatie over tekenreeksen.

In C-programma's moet elke instructie worden beëindigd door een puntkomma (dwz ; ).

    return 0;
 

Toen we main() definieerden, verklaarden we dat het een functie was die een int retourneerde, wat betekent dat het een geheel getal moet retourneren. In dit voorbeeld retourneren we de gehele waarde 0, die wordt gebruikt om aan te geven dat het programma succesvol is afgesloten. Na de return 0; verklaring, wordt het uitvoeringsproces beëindigd.

Programma bewerken

Eenvoudige teksteditors zijn vim of gedit op Linux of Notepad op Windows. Cross-platform editors bevatten ook Visual Studio Code of Sublime Text .

De editor moet gewone tekstbestanden maken, geen RTF of een ander formaat.

Het compileren en uitvoeren van het programma

Om het programma uit te voeren, moet dit bronbestand ( hello.c ) eerst worden gecompileerd in een uitvoerbaar bestand (bijv. hello op Unix / Linux-systeem of hello.exe op Windows). Dit wordt gedaan met behulp van een compiler voor de C-taal.

Meer informatie over compileren

Compileren met GCC

GCC (GNU Compiler Collection) is een veel gebruikte C-compiler. Om het te gebruiken, opent u een terminal, gebruikt u de opdrachtregel om naar de locatie van het bronbestand te navigeren en voert u het volgende uit:

gcc hello.c -o hello
 

Als er geen fouten worden gevonden in de broncode ( hello.c ), maakt de compiler een binair bestand , waarvan de naam door het argument wordt gegeven aan de opdrachtregeloptie -o ( hello ). Dit is het laatste uitvoerbare bestand.

We kunnen ook de waarschuwingsopties -Wall -Wextra -Werror , die helpen bij het identificeren van problemen die ertoe kunnen leiden dat het programma mislukt of onverwachte resultaten -Wall -Wextra -Werror . Ze zijn niet nodig voor dit eenvoudige programma, maar dit is een manier om ze toe te voegen:

gcc -Wall -Wextra -Werror -o hello hello.c
 

De clang-compiler gebruiken

Om het programma met clang te compileren, kunt u het volgende gebruiken:

clang -Wall -Wextra -Werror -o hello hello.c
 

Door het ontwerp zijn de clang opdrachtregelopties vergelijkbaar met die van GCC.

Het gebruik van de Microsoft C-compiler vanaf de opdrachtregel

Als u de Microsoft cl.exe compiler gebruikt op een Windows-systeem dat Visual Studio ondersteunt en als alle omgevingsvariabelen zijn ingesteld, kan dit C-voorbeeld worden gecompileerd met de volgende opdracht die een uitvoerbaar hello.exe bestand hello.exe in de map waarin de opdracht wordt uitgevoerd in (Er zijn waarschuwingsopties zoals /W3 voor cl , ongeveer analoog aan -Wall enz. Voor GCC of clang).

cl hello.c
 

Programma uitvoeren

Eenmaal gecompileerd, kan het binaire bestand worden uitgevoerd door ./hello in de terminal te typen. Na uitvoering zal het gecompileerde programma Hello, World , gevolgd door een nieuwe regel, afdrukken naar de opdrachtprompt.

Originele "Hallo wereld!" in K&R C

Het volgende is de originele "Hallo wereld!" programma uit het boek The C Programming Language van Brian Kernighan en Dennis Ritchie (Ritchie was de oorspronkelijke ontwikkelaar van de C programmeertaal bij Bell Labs), aangeduid als "K&R":

K & R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

Merk op dat de programmeertaal C niet was gestandaardiseerd op het moment van schrijven van de eerste editie van dit boek (1978), en dat dit programma waarschijnlijk niet zal compileren op de meeste moderne compilers tenzij ze worden geïnstrueerd om C90-code te accepteren.

Dit allereerste voorbeeld in het K&R boek wordt nu beschouwd als van slechte kwaliteit, deels omdat het een expliciet retourtype ontbreekt voor main() en deels omdat het een return mist. De 2e editie van het boek is geschreven voor de oude C89-standaard. In C89 zou het type main standaard int , maar het K&R-voorbeeld retourneert geen gedefinieerde waarde naar de omgeving. In C99 en latere standaarden is het retourtype vereist, maar het is veilig om de return van main (en alleen main ) weg te laten, vanwege een speciaal geval dat is geïntroduceerd met C99 5.1.2.2.3 - het is gelijk aan retourneren 0 , wat duidt op succes.

De aanbevolen en meest draagbare vorm van main voor gehoste systemen is int main (void) wanneer het programma geen opdrachtregelargumenten gebruikt, of int main(int argc, char **argv) wanneer het programma wel de opdrachtregelargumenten gebruikt.


C90 §5.1.2.2.3 Programma-beëindiging

Een terugkeer van de eerste oproep aan de main functie is gelijk aan het aanroepen van de exit functie met de waarde die door de main functie als argument. Als de main een terugkeer uitvoert die geen waarde opgeeft, is de beëindigingsstatus die wordt geretourneerd naar de hostomgeving niet gedefinieerd.

C90 §6.6.6.4 De return

Als een return statement zonder een expressie wordt uitgevoerd, en de waarde van de functie oproep wordt gebruikt door de beller, wordt het gedrag ongedefinieerd. Het bereiken van de } die eindigt een functie is gelijk aan het uitvoeren van een return instructie zonder expressie.

C99 §5.1.2.2.3 Programma-beëindiging

Als het retourtype van de main een type is dat compatibel is met int , is een terugkeer van de initiële aanroep naar de main gelijk aan het aanroepen van de exit met de waarde die door de main geretourneerd als argument; het bereiken van } dat de main beëindigt, retourneert een waarde van 0. Als het retourtype niet compatibel is met int , is de beëindigingsstatus die wordt geretourneerd naar de hostomgeving niet gespecificeerd.