Le programme disant "Bonjour !" (ou plutôt "Hello world !") est le programme traditionnel débutant la présentation d'un langage.
En voici donc une première version en C : bonjour.c

Pour pouvoir exécuter ce programme, il faut le compiler et le lier avec la bibliothèque standard libc, en particulier pour pouvoir utiliser la fonction printf de la ligne 3.
Pour cela, on peut exécuter la commande :
$ gcc bonjour.c
$ a.out
Bonjour !

Pour donner un nom plus significatif à l'exécutable, on utilise l'option -o
$ gcc bonjour.c -o bonjour
$ bonjour
Bonjour !

L'utilisation de l'option -Wall, qui signale des écritures suceptibles d'entraîner des erreurs (warning) nous montre que ce simple exemple n'est pas parfait :
$ gcc -Wall bonjour.c -o bonjour
bonjour.c: In function `main':
bonjour.c:3: warning: implicit declaration of function `printf'
bonjour.c:4: warning: control reaches end of non-void function

Le premier avertissement signale que la fonction printf , qui est définie dans la libc, n'est pas déclarée, alors qu'elle est utilisée à la ligne 3. Elle est donc utilisée sans contrôle sur la validité des types des paramètres et est censée renvoyer un int.
L'ajout du fichier d'entête stdio.h permet de régler ce problème. Ce fichier est généralement situé dans le répertoire /usr/include.
On y trouve en particulier la déclaration de la fonction printf utilisée dans le programme bonjour :
int      printf(const char *, ...);

La compilation avec le nouveau bonjour.c montre que le premier problème a disparu.
$ gcc -Wall bonjour.c -o bonjour
bonjour.c: In function `main':
bonjour.c:6: warning: control reaches end of non-void function

Le second avertissement signale que la fonction main est déclarée comme renvoyant un int et malgré cela se termine sans instruction return. Le simple rajout dans bonjour.c de l'instruction
return EXIT_SUCCESS;
provoque une erreur, la constante EXIT_SUCCESS n'étant pas définie.
$ gcc -Wall bonjour.c -o bonjour
bonjour.c: In function `main':
bonjour.c:6: error: `EXIT_SUCCESS' undeclared (first use in this function)
bonjour.c:6: error: (Each undeclared identifier is reported only once
bonjour.c:6: error: for each function it appears in.)

Pour corriger cette erreur, il suffit d'inclure le fichier d'entête stdlib.h. On y trouve en particulier la définition de EXIT_SUCCESS :
#define EXIT_SUCCESS    0

Maintenant, notre programme bonjour.c est parfait. On peut également vérifier avec l'option de compilation -pedantic qu'il est parfaitement conforme à la norme ISO.
$ gcc -Wall -pedantic bonjour.c -o bonjour
$ bonjour
Bonjour !

L'outil make permet de faciliter la compilation et la gestion des fichiers d'un programme. La directive de compilation devient alors simplement make. Il est possible de la compléter avec d'autres directives. Pour cela, il est nécessaire de créer auparavant un fichier Makefile adapté.
$ make
gcc -g -Wall -pedantic   -c -o bonjour.o bonjour.c
gcc  -g -Wall -pedantic bonjour.o  -o bonjour
$ make
make: `bonjour' is up to date.
$ make test
bonjour
Bonjour !
$ make clean
rm -f bonjour.o bonjour