C Language Zelfstudie
Aan de slag met C Language
Zoeken…
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:
- GCC, de GNU Compiler Collection
- clang: een front-end uit de C-taalfamilie voor LLVM
- MSVC, Microsoft Visual C / C ++ bouwtools
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;
}
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":
#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 deexit
functie met de waarde die door demain
functie als argument. Als demain
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 eenreturn
instructie zonder expressie.
C99 §5.1.2.2.3 Programma-beëindiging
Als het retourtype van de
main
een type is dat compatibel is metint
, is een terugkeer van de initiële aanroep naar demain
gelijk aan het aanroepen van deexit
met de waarde die door demain
geretourneerd als argument; het bereiken van}
dat demain
beëindigt, retourneert een waarde van 0. Als het retourtype niet compatibel is metint
, is de beëindigingsstatus die wordt geretourneerd naar de hostomgeving niet gespecificeerd.