2011-12-17 11 views
23

Sto provando a utilizzare il file di libreria stdbool.h in un programma C. Quando provo a compilare, tuttavia, appare un messaggio di errore che dice che intellisense non può aprire il file sorgente stdbool.h.cercando di utilizzare "#include <stdbool.h>" in VS 2010

Qualcuno può consigliare come ricevere lo studio visivo per riconoscerlo? Questo file di intestazione è valido? Sto leggendo un libro sull'apprendimento della programmazione in C.

+11

'' è C99. Visual Studio non la supporterà mai. Trova un altro compilatore. –

+5

Il tempo apparentemente freddo non conosce limiti (ad esempio potrebbe essersi innevato nell'oltretomba), il supporto C99 sta finalmente iniziando con VS 2013, incluso stdbool.h. [http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx] – John

+8

@AlexandreC .: ciao dal 2015!L'ultimo VS ha stdbool.h ora! * ridacchia * – Mints97

risposta

25
typedef int bool; 
#define false 0 
#define true 1 

funziona bene. Le intestazioni di Windows fanno la stessa cosa. Non c'è assolutamente motivo di preoccuparsi della memoria "sprecata" spesa memorizzando un valore a due bit in un int.

Come Alexandre ha menzionato in un commento, il compilatore C di Microsoft (in bundle con Visual Studio) doesn't support C99 e probabilmente non lo farà. È un peccato, perchée molte altre funzionalità molto più utili sono supportate in C99, ma non in Visual Studio. È rimasto bloccato in passato, supportando solo lo standard più vecchio noto come C89. Sono sorpreso che tu non abbia incontrato un problema nel tentativo di definire variabili da qualche parte oltre l'inizio di un blocco. Che mi morde ogni tempo scrivo codice C in VS.

Una possibile soluzione è configurare Visual Studio per compilare il codice come C++. Quindi quasi tutto ciò che leggi nel libro C99 funzionerà senza il soffocamento del compilatore. In C++, è incorporato il tipo bool (sebbene sia un tipo da 1 byte in modalità C++, piuttosto che un tipo da 4 byte come in modalità C). Per apportare questa modifica, è possibile modificare le impostazioni di compilazione del progetto all'interno dell'IDE o semplicemente rinominare il file in modo che disponga di un'estensione cpp (anziché di c). VS imposterà automaticamente la modalità di compilazione di conseguenza.

Le versioni moderne di Visual Studio (2013 e successive) offrono un supporto migliorato per C99, ma non è ancora completo. Onestamente, la soluzione migliore se stai cercando di imparare C (e quindi C99 al giorno d'oggi) è solo prendere un compilatore diverso. MinGW è una buona opzione se stai usando Windows. Un sacco di persone come il Code::Blocks IDE

+0

Grazie mille per questo. Ho imparato tanto da pochi paragrafi! Grazie ancora! Ho intenzione di provare i compilatori che hai menzionato. Buon Natale! – John

+0

Questa è una risposta valida e completa. per quanto riguarda il compilatore, ho usato DevC++ e anche Code :: Blocks, nessuno di loro ha il giusto intellisense e la colorazione del codice che rende difficile leggere nuovamente i codici c. Anche se non mi piacciono molte delle funzionalità che Visual Studio installa sul tuo sistema con la forza e molti bug che sono ancora presenti dalla versione 2003 fino ad ora, è ancora la cosa migliore negli IDE. Visual Studio 2010 aggiunge la possibilità di oscurare le parti che hai inserito nella direttiva del compilatore '# ifdef' che non sono attive. è molto utile quando si traccia un bug di compilazione – AaA

+0

Di seguito sono riportate le segnalazioni di bug correlate su Connect: [773523] (http://connect.microsoft.com/VisualStudio/feedback/details/773523/) e [748766] (http://connect.microsoft.com/VisualStudio/feedback/details/748766/). Vota in modo che possano pensare di implementare le intestazioni mancanti C99 e C11. –

13

creare il proprio file per sostituire stdbool.h che assomiglia a questo:

#pragma once 

#define false 0 
#define true 1 

#define bool int 

In Visual Studio 2010 ho avuto un problema con typedef int bool; come suggerito altrove. IntelliSense si è lamentato di una "combinazione non valida di specificatori di tipi". Sembra che il nome "bool" sia ancora speciale, anche se non è definito.

+0

+1 . Questo ha funzionato per me. – JackOLantern

+0

ho fatto riferimento questa soluzione qui: https://github.com/metabench/jsgui-node-png/issues/2 PDF archivio: https://www.dropbox.com/s/dgyzrx89w6g4oit/npm%20install%20jsgui -node-p ... pdf –

+1

È speciale per IntelliSense, perché il compilatore IntelliSense di front-end è un compilatore C++. Nello specifico, in VS 2010, è il compilatore EDG. Puoi semplicemente ignorare gli avvisi IntelliSense. –

2

Proprio come un avvertimento, su piattaforme x64, VS2017 (io non sono sicuro di versioni precedenti) definisce bool come un valore di 1 byte in C++ (per esempio un char). Quindi questo

typedef int bool; 

potrebbe essere veramente pericoloso se lo si utilizza come un int (4 byte) in file C e come un nativo bool in C++ (1 byte) (ad esempio un struct in un .h potrebbe avere dimensioni diverse a seconda se lo compili con C o C++).