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).