8
votes

C n'a pas de bool? Aussi vs2010 question

J'utilise VS 2010 Pro.

Premier, C n'a pas de type BOOL? Je dois juste utiliser Int avec 0/1. Semble étrange comme la plupart des langues considèrent boolean un type standard.

Aussi j'ai Visual Studio 2010 Pro mais n'a pas de "projet C". Je viens de créer un projet vide C ++. Les noms de fichiers se terminent par .c

Le problème avec ceci est que les mots-clés sont gâchés (Affiche Bool comme en surbrillance / valide dans l'éditeur, mais le compilateur ne l'aime pas).

Je suis allé réparer / ajouter des composants et ils ont C #, F #, C ++, Visual Basic; mais non c?


1 commentaires

Pour ceux qui viennent à la question qui ont vs2013 ou ultérieur, bool est maintenant pris en charge via stdbool.h . Je ne suis pas sûr de l'appui à VS2012.


6 Réponses :


15
votes

La dernière standard C (C99) a un type de bool en effet. Il suffit d'inclure stdbool.h et vous pouvez l'utiliser. Malheureusement, MSVC n'entraîne pas le bon soutien pour C du tout. Seulement partiel C89.


13 commentaires

Vous voulez dire stdbool.h . En tout cas, OP utilise MSVC qui ne prend pas en charge le langage C, moins moins «la plus récente norme C» ...


@R: MSVC prend en charge C (C90), juste pas C99.


BOOL est un typlef. Le type prédéfini est _bool .


@Nemanja: Ce n'est pas le cas. WPRINTF (L "% S", "Hello World \ N"); fait partie du langage C qui ne fonctionne pas sur MSVC.


Ouais, il devrait basculer vers un compilateur C approprié (GCC) ou coller avec C ++ qui a également un type de bool.


@R: Cela fait partie de C99, mais pas C90. Je viens de ré-vérifié la norme (HardCopy - quelle douleur) et elle ne liste pas du tout WPRINTF.


@R: Essayez WPrintf avec GCC (sans l'option "-std = c99")


Alors msvc suce pour C? Qu'est-ce qu'un bon compilateur / IDE sur Windows pour le code C?


Je trouve R.'s WPRINTF () Exemple intéressant. Comportement définitivement non standard (intentionnellement par Microsoft). Il est logique de savoir comment la MS a mis en œuvre leurs plates-formes «ANSI» / «UNICODE '» et renforcer les techniques lorsque vous. Mais ce n'est certainement pas conforme standard. Au fait, WPRINTF () n'a pas été initialement dans C90, il a été ajouté à l'amendement 1 de 1995 (je pense). Je n'ai aucune idée du niveau de soutien des revendications de la SP pour l'amendement de 1995.


@ user697111 définitivement GCC . Voici quelques bons IDes: Code :: Blocs et Codelite . Les deux sont livrés avec MINGW GCC intégré.


@ATHABASKA - Un peu de triviale: tandis que MINGW a beaucoup mieux le support C99 que MSVC, il échouera également par R. WPRINTF () exemple parce que MINGW s'appuie fortement sur le MSVCrT.dll. .


@Michael Burr OP demandait un compilateur et des IDE appropriés pour C et je lui ai donné quelques suggestions. En ce qui concerne le soutien widecharar, il est trop brisé pour être utile. Pour autant que je sache, les normes C ++ 0X et C9X sont à venir, essayons de réparer certaines des questions de WCHAR.


@ATHABASKA: Je ne disais pas que votre commentaire était de quelque mauvaise idée - juste un peu de trivia (l'exemple précédent de R.). En outre, je n'avais jamais entendu parler de Codelite avant - je devrai vérifier. Donc, merci pour ça! (La dernière fois que j'ai regardé le code :: Blocs - Certes, il y a longtemps, il était trop léthargique pour me rendre heureux).



6
votes

Le langage C actuel (C99) a un type BOOL (en réalité _bool , mais y compris stdbool.h déclare un dactylef Alias ​​ BOOL Pour IT), mais depuis que vous utilisez MSVC, cela n'est pas disponible pour vous. Dans tous les cas, l'utilisation de types booléens en C est totalement non idiomatique et largement inutile. Il suffit d'utiliser int comme tout le monde. Ou si vous avez besoin d'un tableau géant d'entre eux, faites votre propre implémentation de la matrice.


3 commentaires

+1 pour non idiomatique et inutile! Même les fonctions sont * en C99 ne renvoient pas _bool s.


"L'utilisation de types booléens en C est totalement non idiomatique et largement inutile" - un peu comme court .


Il rend le code beaucoup plus lisible pour utiliser des booléens au lieu d'entiers. Versions récentes de MSVC Ajout de la prise en charge de BOOL en Code C.



1
votes

Concernant le type BOOL: En C, toute valeur non nulle est considérée comme "vraie" (et zéro est "faux"). Ceci est utile lorsque, disons, vérifiant la valeur d'un pointeur:

#define BOOL int
#define FALSE 0
#define TRUE (!FALSE)


2 commentaires

J'utilise c parce que je veux l'apprendre et OpenGL (qui est aussi c). Je vais probablement passer à C ++ une fois que j'apprends un peu plus? Je suis expérimenté avec Java.


Je suis sûr que vous avez dit cela, mais vous seriez probablement plus à l'aise en C #. Il existe des emballages OpenGL pour C # par exemple, par exemple opentk.com



2
votes

c n'a pas eu de type booléen réel qu'au C99.

En conséquence, idiomatic C n'utilise pas vraiment de symboles ou d'expressions de valeur booléenne en tant que tels (c'est-à-dire que vous ne verrez pas de nombreux tests explicites contre "vrai" ou "faux"). Au lieu de cela, toute expression intégrale à valeur zéro ou un pointeur NULL évaluera à «Faux», et toute expression intégrale non nulle à valeur nominale ou un pointeur non nulle évaluera à «vrai». Vous verrez donc beaucoup de code comme: xxx

expressions relationnelles et égales telles que a == b ou c évaluera à un type intégral avec une valeur de 1 (vrai) ou 0 (faux).

Certaines personnes présentent leurs propres constantes symboliques vraies ou fausses en faisant quelque chose comme xxx

ou les expressions censées évaluer à 0 ou 1); Une fois, j'ai passé une fois l'après-midi à chasser ma queue parce que quelqu'un vissait et laissa tomber une en-tête où true == false.

Pas de coïncidence, c'était le jour où j'ai arrêté d'utiliser des constantes symboliques pour des valeurs booléennes.


0 commentaires


1
votes

Si vous développez en C, je recommanderais un compilateur différent de VC ++ n'est pas un compilateur C moderne et ne prend pas en charge la norme C99. Si vous êtes sur Windows, essayez Mingw, qui vous obtient essentiellement GCC avec accès à Windows-y API Stuff.

Si vous êtes activé à l'aide de Visual Studio, créez votre propre fichier d'en-tête à utiliser au lieu de stdbool.h: < / p> xxx

J'ai trouvé que Visual Studio 2010 s'est plaint si j'essayais d'utiliser un Typedef au lieu d'un #define pour définir < code> bool .


0 commentaires