Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cpp-avanzado:macros [2023/11/29 14:58] santo [El porqué de la macro forn] |
cpp-avanzado:macros [2023/11/29 15:12] (actual) santo [El porqué de la macro forn] |
||
---|---|---|---|
Línea 30: | Línea 30: | ||
</code> | </code> | ||
- | La siguiente sirve para evitar montones de errores peligrosos y muy difíciles de detectar producto de comparar enteros con y sin signo, ya que ''.size()'' retorna un entero sin signo, por lo que al hacerle cuentas resultados como ''-1'' automáticamente pasan a $2^{bits}-1$. Al pasar inmediatamente a entero con signo, evitamos estos problemas. | + | La siguiente sirve para evitar montones de errores peligrosos y muy difíciles de detectar producto de comparar enteros con y sin signo, ya que ''.size()'' retorna un entero sin signo, por lo que al hacerle cuentas resultados como ''-1'' automáticamente pasan a $2^{bits}-1$. El ejemplo más común sería escribir algo como ''if (v.size()-1 >= 0)'', que da siempre ''true'', a diferencia de ''if (SIZE(v)-1 >= 0)'' que se comporta como uno espera. Pasar inmediatamente a entero con signo evita problemas. |
<code cpp> | <code cpp> | ||
- | #define SIZE(c) ((c).size()) | + | #define SIZE(c) int((c).size()) |
</code> | </code> | ||
+ | |||
Línea 63: | Línea 64: | ||
typedef long long tint; | typedef long long tint; | ||
typedef long double tdbl; | typedef long double tdbl; | ||
- | typedef vector<int> vint; | ||
- | typedef pair<int,int> pint; | ||
- | typedef pair<tint,tint> ptint; | ||
</code> | </code> | ||
+ | O su equivalente más moderno: | ||
+ | |||
+ | <code cpp> | ||
+ | using tint = long long; | ||
+ | using tdbl = long double; | ||
+ | </code> | ||
+ | |||
+ | Utilizar ''tint'' para indicar el **t**ipo del **int** permite cambiar entre ''int'', ''unsigned'', ''long long'', ''unsigned long long'', ''__int128'', ''unsigned char'', etc fácilmente si se usa siempre ''tint'' para los "valores" del programa (mientras que se usa por ejemplo ''int'' para los índices de arreglos y colecciones). | ||
===== El porqué de la macro forn ===== | ===== El porqué de la macro forn ===== | ||
Línea 125: | Línea 131: | ||
</code> | </code> | ||
- | ¡Donde ese bug es simplemente **imposible** de escribir! Usar ''i'' ambas veces sería el bug más parecido, pero si usamos las [[:cpp-avanzado:opciones-gcc|opciones de compilación]] recomendadas tendremos un warning por shadow al hacerlo, y es un bug mucho más fácil de detectar. | + | ¡Donde ese bug es simplemente **imposible** de escribir! Usar ''i'' ambas veces sería el bug más parecido, pero si usamos las [[:cpp-avanzado:opciones-gcc|opciones de compilación]] recomendadas tendremos una advertencia por shadow al hacerlo, e incluso sin el warning es un bug mucho más fácil de detectar y corregir. |