C99 et Mingw

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Le compilateur que l’on demande d’installer dans le tutoriel sur le langage c supporte-il la norme C99? Car quand j’essaye d’utiliser le type _Bool avec #include <stdbool.h>, ça ne fonctionne pas.

La question est un peu bête mais, comment modifier Mingw pour qu’il supporte la norme C99?

Merci d’avance.

+0 -0

Salut,

Comment compiles-tu ? Ce code marche.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    _Bool b = false;
    if(!b)
        printf("Yes");
    return 0;
}

Je crois que dans le tutoriel il faut compiler en C89, mais en compilant juste avec gcc, c’est bon.

+0 -0

zcc est un alias que le tutoriel fait créer (regarde ici) qui fait ça en gros.

1
gcc -Wall -Wextra -pedantic -std=c89

Le -std=c89 fait compiler en C89.

+1 -0

Salut,

@Karnaj : juste pour dire, le type _Bool est un type natif, il ne nécessite donc pas l’en-tête <stdbool.h>. Ce dernier n’est là que pour définir la macroconstante bool (pour le type _Bool) et les macroconstantes true et false (valant respectivement 1 et 0). ;)

Si je défini une variable b de type _Bool qui vaut 10 == 10 par exemple, comment faire pour afficher TRUE via printf, on utilise quoi comme indicateur de conversion?

Ozmox

Le type _Bool est techniquement un type entier capable de stocker les valeurs zéro et un. Tu peux donc afficher la valeur d’un objet d’un tel type à l’aide du format %d ou %u (puisque seuls les valeurs 0 et 1 peuvent lui être assignées). Il n’y a donc pas de format spécifique de ce côté fournit par la fonction printf(). Cela peut par contre ce faire simplement à l’aide d’un opérateur conditionnel et de deux chaînes de caractères, mais c’est un peu avancé par rapport à ta position dans le cours.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>
#include <stdbool.h>


int
main(void)
{
        bool test = 10 == 10;

        printf("%s\n", (test) ? "TRUE" : "FALSE");
        return 0;
}
+0 -0

juste pour dire, le type _Bool est un type natif, il ne nécessite donc pas l’en-tête <stdbool.h>. Ce dernier n’est là que pour définir la macroconstante bool (pour le type _Bool) et les macroconstantes true et false (valant respectivement 1 et 0). ;)

En effet, merci pour la précision. :) Il y a des gens qui les utilisent vraiment où c’est marginal ? J’ai vraiment très rarement touché aux booléens de C99 (vu que je compile quasiment toujours pour que ça marche en C89…).

+0 -0

En effet, merci pour la précision. :) Il y a des gens qui les utilisent vraiment où c’est marginal ? J’ai vraiment très rarement touché aux booléens de C99 (vu que je compile quasiment toujours pour que ça marche en C89…).

Karnaj

Très franchement, je n’en ai aucune idée. Je suppose qu’ils sont utilisés lorsque le C99 (ou C11) est choisit étant donné qu’il s’agit d’un vrai type booléen, dans le sens où le compilateur fait bien en sorte que seuls les valeurs 0 ou 1 lui soient assignées.

1
_Bool test = 10; /* test == 1 */

Maintenant, je n’ai pas plus d’idée que ça quant à son adoption.

+0 -0

En revanche, je constate que ce code fonctionne aussi quand je compile avec zcc.

Ozmox

Visiblement, l’en-tête <stdbool.h> de la GNU libc (et aussi de la libc d’OpenBSD) définit le type _Bool dans le cas où il n’existe pas.

1
2
3
4
typedef enum {
    false = 0,
    true = 1
} _Bool;

Je ne connais pas la raison de ce choix étant donné que cet en-tête n’a été ajouté que depuis la norme C99, mais toujours est-il que cela explique pourquoi ton code compile également en C89. ;)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte