usa que para libreria ifdef example bibliotecas c++ c

c++ - libreria - para que se usa#ifndef



En C/C++, ¿existe una directiva similar a#ifndef para typedefs? (12)

C ++ no proporciona ningún mecanismo para que el código pruebe la presencia de typedef ; lo mejor que puedes tener es algo como esto:

#ifndef THING_TYPE_DEFINED #define THING_TYPE_DEFINED typedef uint32_t thing_type #endif

EDITAR:
Como @David, es correcto en su comentario, ¿esto responde al cómo? parte, pero importante, echa de menos el por qué? Se puede hacer de la manera anterior, si quieres hacerlo y todo, pero es importante que probablemente no necesites hacerlo de todos modos, la respuesta y el comentario de @ David explican los detalles, y creo que eso responde la pregunta correctamente.

Si quiero definir un valor solo si no está definido, hago algo como esto:

#ifndef THING #define THING OTHER_THING #endif

¿Qué THING si THING es un identificador typedef ''d y no está definido? Me gustaría hacer algo como esto:

#ifntypedef thing_type typedef uint32_t thing_type #endif

El problema surgió porque quería verificar si una biblioteca externa ya había definido el tipo boolean , pero estaría abierto a escuchar una solución más general.


Como se mencionó anteriormente, esto no está incluido en el estándar de C ++, pero es posible que pueda usar autotools para obtener la misma funcionalidad.

Puede usar la macro ac_cxx_bool para asegurarse de que se define bool (o rutinas diferentes para diferentes tipos de datos).


Como ya han dicho otros, no existe tal cosa, pero si intentas crear un alias para otro tipo, obtendrás un error de compilación:

typedef int myInt; typedef int myInt; // ok, same alias typedef float myInt; // error

Sin embargo, hay una cosa llamada ctag para encontrar dónde se define un typedef.


El problema es realmente PITA real, porque algunas API o SDK redefinen cosas comúnmente usadas. Tuve problema de que los archivos de encabezado para un software de procesamiento de mapas (GIS) estaban redefiniendo las palabras clave TRUE y FALSE (generalmente utilizadas por Windows SDK) para literales enteros en lugar de palabras clave verdaderas y falsas (obviamente, eso puede romper ALGO). Y sí, el famoso chiste "#define true false" es relevante.

define nunca sentiría un typedef o una constante declarada en el código C / C ++ porque el preprocesador no analiza el código, solo escanea para # declaraciones. Y modifica el código antes de dárselo al analizador de sintaxis. ASÍ QUE, en general, no es posible.

https://msdn.microsoft.com/en-us/library/5xkf423c.aspx?f=255&MSPPError=-2147217396 Ese no es portátil hasta el momento, aunque hubo una solicitud conocida para implementarlo en GCC. Creo que también cuenta como "extensión" en MSVC. Es una declaración de compilación, no una declaración de preprocesador, por lo que no "sentirá" macros definidas, sino que detectaría solo los tiposdefuera del cuerpo de la función. "tipo completo" significa que reaccionará en definición completa, ignorando afirmaciones como "clase SomeClass". Úselo bajo su propio riesgo.

Editar: aparentemente también es compatible con MacOS ahora y con el comiler de Intel con -fms-dialect flag (AIX / Linux?)


Esto podría no responder directamente a la pregunta, pero servir como una posible solución a su problema.

¿Por qué no probar algo como esto?

#define DEFAULT_TYPE int // just for argument''s sake #ifndef MY_COOL_TYPE #define MY_COOL_TYPE DEFAULT_TYPE #endif typedef MY_COOL_TYPE My_Cool_Datatype_t;

Luego, si desea personalizar el tipo, puede definir MY_COOL_TYPE en algún lugar arriba (como en un encabezado "configurar" que se incluye en la parte superior de este encabezado) o pasarlo como un argumento de línea de comando al compilar (en la medida en que sé que puedes hacer esto con GCC y LLVM, tal vez otros también).


La solución que terminé usando incluía stdbool.h. Sé que esto no resuelve la cuestión de cómo verificar si un typedef ya está definido, pero me permite asegurar que el tipo booleano está definido.


Las directivas de preprocesador (como #define ) son herramientas de reemplazo de texto crudas, que no saben nada sobre el lenguaje de programación, por lo que no pueden actuar en ninguna definición de nivel de idioma.

Hay dos enfoques para asegurarse de que un tipo solo se defina una vez:

  • Estructurar el código para que cada definición tenga su lugar, y no hay necesidad de múltiples definiciones
  • #define una macro del preprocesador junto con el tipo, y use #ifndef para verificar la definición de la macro antes de definir el tipo.

La primera opción generalmente conducirá a un código más fácil de mantener. El segundo podría causar errores sutiles, si accidentalmente termina con diferentes definiciones del tipo dentro de un programa.


No es transparente, pero puede intentar compilarlo una vez sin typedef (solo con el alias) y ver si se compila o no.


No existe tal cosa en el lenguaje, ni es necesario. Dentro de un solo proyecto, no debe tener el mismo alias typedef que hace referencia a tipos diferentes alguna vez, ya que eso es una violación del ODR, y si va a crear el mismo alias para el mismo tipo, simplemente hágalo. El lenguaje le permite realizar el mismo tipodef tantas veces como desee y, por lo general, detectará ese ODR en particular (dentro de la misma unidad de traducción):

typedef int myint; typedef int myint; // OK: myint is still an alias to int //typedef double myint; // Error: myint already defined as alias to int

Si lo que pretendes hacer es implementar una funcionalidad para diferentes tipos usando un typedef para determinar cuál usar, entonces deberías buscar plantillas en lugar de typedefs.


No, no hay nada como lo que querías. Tuve el mismo problema con las bibliotecas que incluyen sus propios typedefs para cosas como bool . Se convierte en un problema cuando simplemente no les importa lo que usas para bool o si otras libs pueden estar haciendo lo mismo.

Así que esto es lo que hago. Edito el archivo de encabezado para las librerías que hacen tales cosas y encuentro el typedef bool y agrego un código como este:

#ifdef USE_LIBNAME_BOOL typedef unsigned char bool; // This is the lib''s bool implementation #else #include <stdbool.h> #endif

Tenga en cuenta que bool typdef si no quería usar el propio bool typdef . Esto significa que necesita soporte C99 o posterior.


No, no hay tal recurso en C ++ en la etapa de preprocesamiento. Lo máximo que puedes hacer es

#ifndef thing_type #define thing_type uint32_t #endif

Aunque esta no es una buena práctica de codificación y no lo sugiero.


Sin tener que usar una macro, puede determinar si se define un tipo de espacio de nombres typedef al verificar si la compilación falla. Si se trata de un typedef anidado en una estructura, puede usarse SFINAE.

Para namesde-scope typedef puede hacer ambas cosas al mismo tiempo:

typedef int some_type #define some_type some_type

Y entonces:

#ifdef some_type some_type some_var; #endif

Eso es some_type es a la vez un macro de preprocesador y un typedef.