C LanguageDémarrer avec le langage C

Remarques

C est un langage de programmation informatique impératif à usage général, prenant en charge la programmation structurée, la portée de la variable lexicale et la récursivité, tandis qu'un système de type statique empêche de nombreuses opérations imprévues. De par sa conception, C fournit des modèles qui correspondent efficacement aux instructions de la machine, et trouve donc une utilisation durable dans les applications précédemment codées en langage assembleur, y compris les systèmes d’exploitation, et divers logiciels d’application allant des superordinateurs aux systèmes embarqués. .

Malgré ses capacités de bas niveau, le langage a été conçu pour encourager la programmation multi-plateforme. Un programme C conforme aux normes et portable peut être compilé pour une très grande variété de plates-formes informatiques et de systèmes d'exploitation avec peu de modifications apportées à son code source. Le langage est devenu disponible sur un très large éventail de plates-formes, des microcontrôleurs intégrés aux superordinateurs.

C a été développé à l'origine par Dennis Ritchie entre 1969 et 1973 dans les laboratoires Bell et utilisé pour réimplémenter les systèmes d' exploitation Unix. Il est depuis devenu l'un des langages de programmation les plus utilisés de tous les temps, avec des compilateurs C de différents fournisseurs disponibles pour la majorité des architectures et des systèmes d'exploitation informatiques existants.

Compilateurs communs

Le processus de compilation d'un programme C diffère entre les compilateurs et les systèmes d'exploitation. La plupart des systèmes d'exploitation sont livrés sans compilateur, vous devrez donc en installer un. Certains choix de compilateurs courants sont les suivants:

Les documents suivants devraient vous donner un bon aperçu de la manière de commencer à utiliser quelques-uns des compilateurs les plus courants:

Compiler C version Support

Notez que les compilateurs ont différents niveaux de prise en charge du standard C, beaucoup d'entre eux ne supportant toujours pas complètement C99. Par exemple, à partir de 2015, MSVC prend en charge une grande partie de C99, mais il comporte encore des exceptions importantes pour la prise en charge du langage lui-même (par exemple, le prétraitement semble non conforme) et pour la bibliothèque C (par exemple <tgmath.h> ). documentent-ils nécessairement leurs "choix dépendants de la mise en œuvre"? Wikipedia a un tableau montrant le support offert par certains compilateurs populaires.

Certains compilateurs (notamment GCC) ont proposé, ou continuent d'offrir, des extensions de compilateur qui implémentent des fonctionnalités supplémentaires que les producteurs de compilateurs jugent nécessaires, utiles ou susceptibles de faire partie d'une future version C, mais ne font actuellement partie d'aucun standard C. Comme ces extensions sont spécifiques au compilateur, elles peuvent être considérées comme non compatibles entre elles et les développeurs de compilateurs peuvent les supprimer ou les modifier dans des versions ultérieures du compilateur. L'utilisation de telles extensions peut généralement être contrôlée par les indicateurs du compilateur.

De plus, de nombreux développeurs ont des compilateurs qui ne prennent en charge que les versions spécifiques de C imposées par l'environnement ou la plate-forme qu'ils ciblent.

Si vous sélectionnez un compilateur, il est recommandé de choisir un compilateur prenant en charge la dernière version de C autorisée pour l'environnement cible.

Style de code (hors sujet ici):

Parce que l' espace blanc est insignifiante en C (qui est, il ne modifie pas le fonctionnement du code), les programmeurs utilisent souvent l' espace blanc pour rendre le code plus facile à lire et à comprendre, ce qu'on appelle le style de code. C'est un ensemble de règles et de directives utilisées lors de l'écriture du code source. Il couvre des problèmes tels que la manière dont les lignes doivent être mises en retrait, si des espaces ou des tabulations doivent être utilisés, comment les accolades doivent être placées, comment utiliser des espaces autour des opérateurs et des parenthèses, comment nommer les variables, etc.

Le style de code n'est pas couvert par la norme et est principalement basé sur l'opinion (différentes personnes trouvent différents styles plus faciles à lire), en tant que tel, il est généralement considéré comme hors sujet sur SO. Le conseil primordial sur le style dans son propre code est que la cohérence est primordiale - choisissez ou créez un style et respectez-le. Il suffit d'expliquer qu'il existe divers styles nommés d'usage courant qui sont souvent choisis par les programmeurs plutôt que de créer leur propre style.

Certains styles de retrait courants sont: le style K & R, le style Allman, le style GNU, etc. Certains de ces styles ont des variantes différentes. Allman, par exemple, est utilisé comme Allman ordinaire ou comme variante populaire, Allman-8. Des informations sur certains styles populaires sont disponibles sur Wikipedia . Ces noms de style proviennent des normes que les auteurs ou les organisations publient souvent pour les nombreuses personnes contribuant à leur code, afin que chacun puisse facilement lire le code lorsqu'il connaît le style, comme le guide de formatage GNU le document sur les normes de codage GNU .

Certaines conventions de nommage courantes sont: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS, etc. Ces styles sont combinés de différentes manières pour être utilisés avec différents objets et types (par exemple, les macros utilisent souvent le style ALL_CAPS)

Le style K & R est généralement recommandé pour une utilisation dans la documentation SO, tandis que les styles plus ésotériques, tels que Pico, sont déconseillés.

Bibliothèques et API non couvertes par la norme C (et donc hors sujet ici):

Versions

Version la norme Date de publication
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

Bonjour le monde

Pour créer un programme C simple qui affiche "Hello, World" à l'écran, utilisez un éditeur de texte pour créer un nouveau fichier (par exemple, hello.c - l'extension du fichier doit être .c ) contenant le code source suivant:

Bonjour c

#include <stdio.h>

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

Démo en direct sur Coliru

Regardons ce programme simple ligne par ligne

#include <stdio.h>
 

Cette ligne indique au compilateur d'inclure le contenu du fichier d'en-tête de bibliothèque standard stdio.h dans le programme. Les en-têtes sont généralement des fichiers contenant des déclarations de fonction, des macros et des types de données, et vous devez inclure le fichier d'en-tête avant de les utiliser. Cette ligne inclut stdio.h pour pouvoir appeler la fonction puts() .

Voir plus sur les en-têtes.

int main(void)
 

Cette ligne commence la définition d'une fonction. Il indique le nom de la fonction ( main ), le type et le nombre d'arguments attendus ( void , c'est-à-dire none) et le type de valeur renvoyé par cette fonction ( int ). L'exécution du programme commence dans la fonction main() .

{
    …
}
 

Les accolades sont utilisées par paires pour indiquer où commence et se termine un bloc de code. Ils peuvent être utilisés de nombreuses manières, mais dans ce cas ils indiquent où la fonction commence et se termine.

    puts("Hello, World");
 

Cette ligne appelle la fonction puts() pour sortir du texte sur la sortie standard (l'écran, par défaut), suivi d'une nouvelle ligne. La chaîne à afficher est comprise dans les parenthèses.

"Hello, World" est la chaîne qui sera écrite à l'écran. En C, chaque valeur littérale de chaîne doit figurer entre les guillemets "…" .

Voir plus sur les chaînes.

Dans les programmes C, chaque instruction doit être terminée par un point-virgule (ie ; ).

    return 0;
 

Lorsque nous avons défini main() , nous l'avons déclaré comme une fonction renvoyant un int , ce qui signifie qu'il doit retourner un entier. Dans cet exemple, nous retournons la valeur entière 0, qui est utilisée pour indiquer que le programme s'est terminé avec succès. Après le return 0; déclaration, le processus d'exécution se terminera.

Modifier le programme

Les éditeurs de texte simples incluent vim ou gedit sous Linux ou Notepad sous Windows. Les éditeurs multi-plateformes incluent également Visual Studio Code ou le Sublime Text .

L'éditeur doit créer des fichiers texte, pas RTF ou autre format.

Compiler et exécuter le programme

Pour exécuter le programme, ce fichier source ( hello.c ) doit d'abord être compilé dans un fichier exécutable (par exemple, hello sur le système Unix / Linux ou hello.exe sur Windows). Ceci est fait en utilisant un compilateur pour le langage C.

Voir plus sur la compilation

Compiler en utilisant GCC

GCC (GNU Compiler Collection) est un compilateur C largement utilisé. Pour l'utiliser, ouvrez un terminal, utilisez la ligne de commande pour accéder à l'emplacement du fichier source, puis exécutez:

gcc hello.c -o hello
 

Si aucune erreur n'est trouvée dans le code source ( hello.c ), le compilateur créera un fichier binaire , dont le nom est donné par l'argument de l'option de ligne de commande -o ( hello ). C'est le fichier exécutable final.

Nous pouvons également utiliser les options d'avertissement -Wall -Wextra -Werror , qui aident à identifier les problèmes pouvant entraîner l'échec du programme ou produire des résultats inattendus. Ils ne sont pas nécessaires pour ce programme simple mais c'est une manière de les ajouter:

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

Utiliser le compilateur clang

Pour compiler le programme en utilisant clang vous pouvez utiliser:

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

De par leur conception, les options de ligne de commande clang sont similaires à celles de GCC.

Utilisation du compilateur Microsoft C à partir de la ligne de commande

Si vous utilisez le compilateur Microsoft cl.exe sur un système Windows qui prend en charge Visual Studio et si toutes les variables d'environnement sont définies, cet exemple C peut être compilé à l'aide de la commande suivante qui produira un fichier exécutable hello.exe dans le répertoire (Il existe des options d'avertissement telles que /W3 pour cl , à peu près analogues à -Wall etc. pour GCC ou clang).

cl hello.c
 

Exécuter le programme

Une fois compilé, le fichier binaire peut alors être exécuté en tapant ./hello dans le terminal. Lors de l'exécution, le programme compilé affichera Hello, World , suivi d'une nouvelle ligne, à l'invite de commande.

Original "Bonjour, Monde!" dans K & R C

Ce qui suit est l'original "Hello, World!" programme du livre The C Programming Language de Brian Kernighan et Dennis Ritchie (Ritchie était le développeur original du langage de programmation C chez Bell Labs), dénommé "K & R":

K & R
#include <stdio.h>

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

Notez que le langage de programmation C n'était pas standardisé au moment de la rédaction de la première édition de ce livre (1978), et que ce programme ne sera probablement pas compilé sur la plupart des compilateurs modernes à moins qu'ils soient invités à accepter le code C90.

Ce tout premier exemple du livre de K & R est maintenant considéré comme de mauvaise qualité, en partie parce qu’il manque un type de retour explicite pour main() et en partie parce qu’il ne contient pas d’instruction de return . La deuxième édition du livre a été écrite pour l'ancienne norme C89. En C89, le type de main par défaut est int , mais l'exemple de K & R ne renvoie pas de valeur définie à l'environnement. Dans les normes C99 et ultérieures, le type de retour est obligatoire, mais il est prudent de ne pas inclure l'instruction return de main (et uniquement de main ), en raison d'un cas particulier introduit avec C99 5.1.2.2.3 - cela équivaut à renvoyer 0 , ce qui indique le succès.

La forme recommandée et la plus portable de main pour les systèmes hébergés est int main (void) lorsque le programme n'utilise aucun argument de ligne de commande, ou int main(int argc, char **argv) lorsque le programme utilise les arguments de ligne de commande.


C90 §5.1.2.2.3 Terminaison du programme

Un retour de l'appel initial à la fonction main revient à appeler la fonction exit avec la valeur renvoyée par la fonction main comme argument. Si la fonction main exécute un retour qui ne spécifie aucune valeur, l'état de la terminaison renvoyé à l'environnement hôte n'est pas défini.

C90 §6.6.6.4 La déclaration de return

Si une instruction de return sans expression est exécutée et que la valeur de l'appel de fonction est utilisée par l'appelant, le comportement est indéfini. Atteindre le } qui termine une fonction équivaut à exécuter une instruction de return sans expression.

C99 §5.1.2.2.3 Résiliation du programme

Si le type de retour de la fonction main est un type compatible avec int , un retour de l'appel initial à la fonction main revient à appeler la fonction exit avec la valeur renvoyée par la fonction main comme argument; Si vous atteignez le } qui termine la fonction main , la valeur 0 est renvoyée. Si le type de retour n'est pas compatible avec int , l'état de la terminaison renvoyé à l'environnement hôte n'est pas spécifié.