Configurer CodeBlocks

Michel Billaud (michel.billaud@laposte.net)

29 janvier 2022

Ce texte fait partie d’une petite collection de notes mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France.

1 Objectifs

Sur le Web, certains cours recommandent aux débutants en C/C++ d’utiliser l’IDE (Integrated Development Environment = environnement de développement intégré) CodeBlocks pour leurs premiers pas en C ou C++

Cette note n’est pas là pour critiquer ce choix, ni les cours en question - malgré le mal que j’en pense - mais pour aider à le configurer correctement pour débuter.

Ici on montre comment

2 Affichage des avertissements.

2.1 Un exemple

#include <stdio.h>

int main()
{
    int nombre;
    printf("Donnez un nombre :");
    scanf("%d", &nombre);
    printf("Le nombre vaut %d\n", &nombre);
}

qui a un petit souci (les redoublants, ne soufflez pas).

2.2 Compilation et exécution

Quand on le compile, on ne voit pas de problème

gcc test1.c 

mais à l’exécution :

$ ./a.out 
Donnez un nombre :12
Le nombre vaut -1696745668

3 Une erreur détectable

Cette erreur était pourtant détectable par le compilateur. En fait ce n’est pas tout à fait une erreur, parce que la norme du langage C autorise ce qu’on a écrit, le problème étant que ça ne fait pas ce qu’on souhaitait probablement.

Bref, le compilateur peut le signaler sous forme d’avertissement (Warning) plutôt que de d’erreur. Mais il faut le lui demander, par une option explicite -Wall pour avoir tous les avertissements (Warnings all)

$ gcc -Wall test1.c 
test1.c: In function ‘main’:
test1.c:8:26: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
    8 |  printf("Le nombre vaut %d\n", &nombre);
      |                         ~^     ~~~~~~~
      |                          |     |
      |                          int   int *
      |                         %ls

C’est la même option pour le compilateur clang, qui produit généralement des messages plus clairs que gcc

$ clang -Wall test1.c 
test1.c:8:32: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
        printf("Le nombre vaut %d\n", &nombre);
                               ~~     ^~~~~~~
1 warning generated.

D’autres options fournissent encore plus de messages d’avertissements, non seulement à cause du code qui serait “limite” par rapport au standard, mais aussi un peu louche du côté des pratiques de programmation.

Sur cet exemple ça ne produit rien de plus, mais je recommande vivement de combiner les trois options -Wall -Wextra -pedantic.

3.1 Premier programme, voir les messages

Mon poste de travail est sous Linux avec la distribution Debian. La version de CodeBlocks qui s’installe est la 20.03.

Lors de la première utilisation, il me demande de choisir le compilateur par défaut, je choisi gcc (gcc et clang sont déja installés).

Vue sur l’éditeur
Compilation et exécution

Ça ne va pas mieux marcher. Et on ne voit toujours pas de message d’erreur ni d’avertissements

En fait pour les voir, il faut passer de l’onglet Build Log à celui des Build messages, dans le panneau du bas “Logs and others” :

Messages

3.2 Configurer les messages

On peut configurer les options concernant les messages d’erreur, à deux niveaux

Faites défiler, vous trouverez les options qui vous intéressent :

Options pour les Messages

4 Préciser le standard du langage

Pour écrire du code, on choisit un langage de programmation, et plus précisément de se conformer à un standard pour ce langage.

Par exemple, si on programme en C, on peut choisir les standards C99, C11, C17, ou des versions du langage avec extensions. Pour C++ : 98, 11, 14, 17 et 20.

En général, il est préférable de choisir le standard le plus récent (l’histoire va dans ce sens), mais on peut aussi être contraint de se fixer sur un standard plus ancien, pour rester compatible avec d’autres développeurs qui ne disposent pas d’outils plus à jour. Ou parce qu’une fonctionnalité obsolète, dont on a absolument besoin, a été retirée du standard.

Le choix du standard se fait dans la même boite :

Choix du standard

Exercice : créez un projet C++, avec le source suivant

#include <iostream>

int main()
{
    for (auto i = 1; i <= 5; i++) {
        std::cout << "Hello !"<< std::endl;
    }
    return 0;
}

En jouant avec les options, déterminez à partir de quel niveau de standard le mot-clé auto est reconnu pour déclarer des variables.