tipos programar para lenguaje ejemplos c++ c c-preprocessor tilde

c++ - programar - ¿Qué significa la tilde(~) en macros?



tipos de macros en excel (3)

Visto en este sitio , el código muestra macro invocaciones usando una tilde entre paréntesis:

HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)) // ^^^

¿Qué significa / hacer? Sospecho que solo es un argumento vacío, pero no estoy seguro. ¿Es tal vez específico de C (99) como que __VA_ARGS__ es específico de C99 y existe en C ++?


El ~ no hace nada. Casi cualquier otro contenido dentro de esos paréntesis funcionaría de la misma manera.

El eje de este truco es probar si _TRIGGER_PARENTHESIS_ está al lado de (~) en la expansión de _TRIGGER_PARENTHESIS_ __VA_ARGS__ (~) . De cualquier forma, HAS_COMMA(...) expande sus argumentos a 0 o 1 .


En la página de introducción de Boost.Preprocessor, se da un ejemplo en A.4.1.1 Repetición horizontal

#define TINY_print(z, n, data) data #define TINY_size(z, n, unused) / template <BOOST_PP_ENUM_PARAMS(n, class T)> / struct tiny_size< / BOOST_PP_ENUM_PARAMS(n,T) / BOOST_PP_COMMA_IF(n) / BOOST_PP_ENUM( / BOOST_PP_SUB(TINY_MAX_SIZE,n), TINY_print, none) / > / : mpl::int_<n> {}; BOOST_PP_REPEAT(TINY_MAX_SIZE, TINY_size, ~) // Oh! a tilde! #undef TINY_size #undef TINY_print

Una explicación se proporciona a continuación:

El proceso de generación de código se inicia llamando a BOOST_PP_REPEAT , una macro de orden superior que invoca repetidamente la macro nombrada por su segundo argumento ( TINY_size ). El primer argumento especifica el número de invocaciones repetidas, y el tercero puede ser cualquier dato; se pasa inalterado a la macro que se invoca. En este caso, TINY_size no usa esa información, por lo que la opción de pasar ~ fue arbitraria. [5]

(énfasis mío)

Y está la nota:

[5] ~ no es una elección completamente arbitraria. Tanto @ como $ podrían haber sido buenas elecciones, excepto que técnicamente no son parte del conjunto de caracteres básicos que las implementaciones de C ++ deben soportar. Un identificador como ignorado puede estar sujeto a la expansión de macro, lo que lleva a resultados inesperados.

La tilde, por lo tanto, es simplemente un marcador de posición porque se requiere un argumento, pero ninguno es necesario. Dado que cualquier identificador definido por el usuario wannabe podría expandirse, necesita usar algo más.

Resulta que ~ se utiliza en gran medida (la negación binaria no suele llamarse así) en comparación con + o - por ejemplo, por lo que hay pocas posibilidades de confusión. Una vez que te hayas decidido por esto, usarlo consistentemente le da un nuevo significado a la tilde; como usar el operator<< y el operator>> para transmitir datos se ha convertido en un modismo de C ++.


Los argumentos a probar se colocan entre la macro y sus paréntesis, la macro solo se activa si los argumentos están vacíos:

_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)

NOTA: En realidad, el mismo enlace que publicó lo establece. Comprobaré si hay una referencia a esto en el estándar.