usar type metodo ejemplos dato como booleano bool c++ c typedef mixing

type - if bool c++



¿Puedo imitar un encabezado C que redefine bool en C++? (5)

Estoy escribiendo un programa y realmente preferiría escribir en C ++, sin embargo, debo incluir un encabezado C que redefine bool:

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

La solución obvia sería editar el encabezado para decir:

#ifndef __cplusplus # define false 0 # define true 1 typedef int bool; #endif

pero, ay, ya que la biblioteca es de solo lectura, no puedo.

¿Hay alguna manera en que pueda decirle a gcc que ignore este typedef? O, ¿puedo escribir la mayoría de las funciones en C ++ y luego hacer una envoltura de C para las dos? O, ¿debería chuparlo y escribir la cosa en C?


Desafortunadamente, no, no puede usar este archivo en C ++ estándar:

§7.1.3 [dcl.typedef]

6 / En un ámbito dado, no se utilizará un especificador typedef para redefinir el nombre de ningún tipo declarado en ese ámbito para referirse a un tipo diferente.

Así, typedef ... bool; está prohibido.

§17.6.4.3.1 [macro.names]

2 / Una unidad de traducción no debe #define o #undef nombres léxicamente idénticos a las palabras clave, a los identificadores enumerados en la Tabla 3, o a los tokens de atributo descritos en 7.6.

Y en §2.12 [lex.key] encontramos que bool es una palabra clave.

Por lo tanto, está prohibido intentar engañar al compilador utilizando #define bool ... antes de incluir el archivo ofensivo.

Entonces cual es la alternativa ? Como él !

Aísle esa biblioteca ofensiva detrás de su propio encabezado compatible con C & C ++; y compile esta parte como C. Luego puede incluir su propio encabezado en el programa C ++ sin problemas ni trucos.

Nota: sí, la mayoría de los compiladores probablemente acepten #define bool ... , pero el estándar todavía lo prohíbe explícitamente.


Puede compilar el código que usa el encabezado como C, luego simplemente vincularlo con sus archivos de objetos C ++. Probablemente uses MSVC o GCC; ambos pueden compilar código como C ++ o C, y le permitirán crear archivos de objetos compatibles.

Si se trata de una solución limpia o de un exceso innecesario, realmente depende de la situación exacta.


Puede copiar un encabezado incorrecto y usar una copia editada. Dile al compilador la ruta que debería preferir y ...


Puedes hackearlo!

La biblioteca, que se llama fooLib , cree que está utilizando algún tipo de bool que tiene la prerrogativa de definir. Para la biblioteca, bool es solo un identificador.

Entonces, puedes forzarlo a usar otro identificador en su lugar:

#define bool fooLib_bool #include "fooLib.h" #undef bool #undef true #undef false

Ahora el compilador ve la línea ofensiva transformada a esto:

typedef int fooLib_bool;

Te quedas atascado con la interfaz usando el tipo fooLib_bool = int lugar de un bool real, pero eso es imposible de fooLib_bool = int , ya que el código podría depender de las propiedades de int , y la biblioteca binaria se habría compilado con tal suposición al horno en.


Supongo que usted puede envolver el código ofensivo en un encabezado y luego anular la definición de lo que no necesita

Library_wrapper.h:

#define bool something_else // This will get you past the C++ compilation #include "library.h" #undef false #undef true #undef bool

main.cpp:

#include "Library_wrapper.h" #include "boost.h"

Con respecto a typedef ... el compilador debería quejarse si intenta redefinir un tipo básico en C ++. Puede redeclarar un tipo a propósito (está permitido en C ++) o definirlo (reemplazo de texto simple).