2011-12-17 19 views
23

Estoy tratando de usar el archivo de la biblioteca stdbool.h en un programa en C. Sin embargo, cuando intento compilar, aparece un mensaje de error que dice que intellisense no puede abrir el archivo fuente stdbool.h.tratando de usar '#include <stdbool.h>' en VS 2010

¿Alguien puede decirme cómo conseguiría que Visual Studio lo reconozca? ¿Este archivo de encabezado es válido? Estoy leyendo un libro sobre el aprendizaje de la programación C.

+11

'' es C99. Visual Studio nunca lo apoyará. Encuentra otro compilador. –

+5

Aparentemente el clima frío no conoce límites (es decir, puede haber nevado en el inframundo), el soporte C99 finalmente está comenzando con VS 2013, incluido stdbool.h. [http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx] – John

+8

@AlexandreC .: ¡hola de 2015!¡El último VS ahora tiene stdbool.h! * risita * – Mints97

Respuesta

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

funciona muy bien. Los encabezados de Windows hacen lo mismo. No hay absolutamente ninguna razón para preocuparse por la memoria "desperdiciada" gastada almacenando un valor de dos bits en un int.

Como Alexandre mencionó en un comentario, compilador de C de Microsoft (incluido con Visual Studio) doesn't support C99 y probablemente no va a. Es desafortunado, porque stdbool.h y muchas otras características mucho más útiles son compatibles con C99, pero no en Visual Studio. Está atrapado en el pasado, y solo admite el estándar anterior conocido como C89. Me sorprende que no haya tenido problemas para tratar de definir variables en algún lugar que no sea el comienzo de un bloque. Eso me pica cada vez que escribo el código C en VS.

Una posible solución consiste en configurar Visual Studio para compilar el código como C++. Luego casi todo lo que lea en el libro C99 funcionará sin que el compilador se atragante. En C++, el tipo bool está integrado (aunque es un tipo de 1 byte en modo C++, en lugar de un tipo de 4 bytes, como en el modo C). Para hacer este cambio, puede editar la configuración de compilación de su proyecto dentro del IDE, o simplemente puede cambiar el nombre del archivo para tener una extensión cpp (en lugar de c). VS configurará automáticamente el modo de compilación en consecuencia.

Las versiones modernas de Visual Studio (2013 y posteriores) ofrecen compatibilidad mejorada para C99, pero aún no está completa. Honestamente, la mejor solución si estás tratando de aprender C (y por lo tanto C99 en la actualidad) es simplemente elegir un compilador diferente. MinGW es una buena opción si se está ejecutando en Windows. Un montón de gente como el IDE

+0

Muchas gracias por esto. ¡He aprendido mucho de solo unos pocos párrafos! ¡Gracias de nuevo! Voy a probar los compiladores que mencionaste. ¡Que tengas una gran Navidad! – John

+0

Esta es una respuesta buena y completa. con respecto al compilador, utilicé DevC++ y también Code :: Blocks, ninguno de ellos tiene intellisense apropiado y código de colores que hace que sea difícil leer los códigos c de nuevo. Aunque no me gustan muchas de las funciones que Visual Studio instala en su sistema por la fuerza y ​​muchos errores que todavía se transmiten desde la versión 2003 hasta ahora, todavía es mejor en IDE. Visual Studio 2010 agrega la capacidad de atenuar las partes que pones en la directiva del compilador '# ifdef' que no están activas. es muy útil cuando rastrea un error de compilación – AaA

+0

Aquí están los informes de errores relacionados en Connect: [773523] (http://connect.microsoft.com/VisualStudio/feedback/details/773523/) y [748766] (http://connect.microsoft.com/VisualStudio/feedback/details/748766/). Voto para que puedan pensar en implementar las cabeceras faltantes C99 y C11. –

13

Code::Blocks crear su propio archivo para reemplazar stdbool.h que tiene este aspecto:

#pragma once 

#define false 0 
#define true 1 

#define bool int 

En Visual Studio 2010 tuve un problema usando typedef int bool; como se sugiere en otro lugar. IntelliSense se quejó de una "combinación no válida de especificadores de tipo". Parece que el nombre "bool" sigue siendo especial, a pesar de que no está definido.

+0

+1 . Eso funcionó para mí. – JackOLantern

+0

Hice referencia a esta solución aquí: https://github.com/metabench/jsgui-node-png/issues/2 Archivo PDF: https://www.dropbox.com/s/dgyzrx89w6g4oit/npm%20install%20jsgui -node-p ... pdf –

+1

Es especial para IntelliSense, porque el compilador front-end IntelliSense es un compilador C++. Específicamente, en VS 2010, es el compilador EDG. Simplemente puede ignorar las advertencias de IntelliSense. –

2

Solo como advertencia, en las plataformas x64, VS2017 (no estoy seguro de las versiones anteriores) define bool como un valor de 1 byte en C++ (por ejemplo, char). Por lo que este

typedef int bool; 

podría ser muy peligrosa si se utiliza como un (bytes 4) int en archivos de C y como un nativo bool en C++ (1 byte) (por ejemplo, un struct en un .h pueden tener diferentes tamaños dependiendo si lo compila con C o C++).