uso son sirve que programacion para macro las ejemplos dev define creación constantes macros c-preprocessor boost-preprocessor

sirve - que son las macros en programacion



¿Cómo se muestra el valor de un#define en tiempo de compilación? (12)

BOOST_VERSION se define en el archivo de encabezado boost version.hpp.

Estoy tratando de averiguar qué versión de Boost mi código cree que está usando. Quiero hacer algo como esto:

#error BOOST_VERSION

pero el preprocesador no expande BOOST_VERSION.

Sé que podría imprimirlo en tiempo de ejecución desde el programa, y ​​sé que podría ver la salida del preprocesador para encontrar la respuesta. Tengo ganas de tener una forma de hacer esto durante la compilación podría ser útil.


Eche un vistazo a la documentación de Boost también, con respecto a cómo está usando la macro:

En referencia a BOOST_VERSION , de http://www.boost.org/doc/libs/1_37_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.boost_helper_macros :

Describe el número de versión de refuerzo en formato XXYYZZ tal que: (BOOST_VERSION % 100) es la versión menor, ((BOOST_VERSION / 100) % 1000) es la versión menor, y (BOOST_VERSION / 100000) es la versión principal.


Estás buscando

#if BOOST_VERSION != "1.2" #error "Bad version" #endif

No es genial si BOOST_VERSION es una cadena, como he supuesto, pero también puede haber enteros individuales definidos para los números mayor, menor y de revisión.


Hasta donde sé, ''#error'' solo imprimirá cadenas, de hecho , ni siquiera necesita usar comillas .

¿Has intentado escribir varios códigos deliberadamente incorrectos usando "BOOST_VERSION"? Tal vez algo como "blah [BOOST_VERSION] = foo;" le dirá algo así como "string literal 1.2.1 no se puede usar como una dirección de matriz". No será un bonito mensaje de error, pero al menos le mostrará el valor relevante. Puedes jugar hasta que encuentres un error de compilación que te diga el valor.


Mirar la salida del preprocesador es lo más cercano a la respuesta que usted solicita.

Sé que has excluido eso (y otras formas), pero no estoy seguro por qué. Usted tiene un problema bastante específico que resolver, pero no ha explicado por qué ninguno de los métodos "normales" funciona bien para usted.


Puede escribir un programa que imprima BOOST_VERSION y compilarlo y ejecutarlo como parte de su sistema de compilación. De lo contrario, creo que no tienes suerte.


Sé que esto es mucho tiempo después de la consulta original, pero esto puede ser útil.

Esto se puede hacer en GCC usando el operador de stringify "#", pero requiere dos etapas.

#define XSTR(x) STR(x) #define STR(x) #x

El valor de una macro se puede mostrar con:

#pragma message "The value of ABC: " XSTR(ABC)

Ver: 3.4 Stringificación en la documentación en línea de gcc.


Si está usando Visual C ++, puede usar el #pragma message :

#include <boost/preprocessor/stringize.hpp> #pragma message("BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION))

Editar: Gracias a LB por el enlace

Aparentemente, el equivalente de GCC es (no probado):

#pragma message "BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION)


Sin impulso:

  1. define la misma macro otra vez y el compilador HIMSELF dará una advertencia.

  2. Por advertencia, puede ver la ubicación de la definición anterior.

  3. vi archivo de definición anterior.

ambarish@axiom:~/cpp$ g++ shiftOper.cpp shiftOper.cpp:7:1: warning: "LINUX_VERSION_CODE" redefined shiftOper.cpp:6:1: warning: this is the location of the previous definition #define LINUX_VERSION_CODE 265216 #define LINUX_VERSION_CODE 666 int main () { }


También puede preprocesar el archivo fuente y ver a qué evalúa el valor del preprocesador.


BOOST_PP_STRINGIZE parece una excelente solución para C ++, pero no para C.

Aquí está mi solución para GNU CPP:

/* Some test definition here */ #define DEFINED_BUT_NO_VALUE #define DEFINED_INT 3 #define DEFINED_STR "ABC" /* definition to expand macro then apply to pragma message */ #define VALUE_TO_STRING(x) #x #define VALUE(x) VALUE_TO_STRING(x) #define VAR_NAME_VALUE(var) #var "=" VALUE(var) /* Some example here */ #pragma message(VAR_NAME_VALUE(NOT_DEFINED)) #pragma message(VAR_NAME_VALUE(DEFINED_BUT_NO_VALUE)) #pragma message(VAR_NAME_VALUE(DEFINED_INT)) #pragma message(VAR_NAME_VALUE(DEFINED_STR))

Las definiciones anteriores resultan en:

test.c:10:9: note: #pragma message: NOT_DEFINED=NOT_DEFINED test.c:11:9: note: #pragma message: DEFINED_BUT_NO_VALUE= test.c:12:9: note: #pragma message: DEFINED_INT=3 test.c:13:9: note: #pragma message: DEFINED_STR="ABC"

Para las variables "definido como intermediario" , "definido como cadena" y "definido pero sin valor" , funcionan muy bien. Solo para la variable "no definida" , mostraron exactamente lo mismo que el nombre de la variable original. Tienes que acostumbrarte, o tal vez alguien puede ofrecerte una mejor solución.


#define a <::BOOST_VERSION> #include a

MSVC2015 : error fatal C1083: no se puede abrir el archivo de inclusión: '':: 106200'': no ​​existe dicho archivo o directorio

Funciona incluso si el preprocess to file está habilitado, incluso si hay tokens no válidos presentes:

#define a <::''*/`#> #include a

MSVC2015 : error fatal C1083: No se puede abrir el archivo de inclusión: ''::'' * / `# '': No existe dicho archivo o directorio
GCC4.x : advertencia: falta el carácter de terminación [-Winvalid-pp-token]
#define a <:: ''* / `#>