Herramientas de usuario

Herramientas del sitio


cpp-avanzado:macros

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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 es lo más parecido, pero si usamos las [[:​cpp-avanzado:​opciones-gcc|opciones de compilación]] recomendadas tendremos ​un warning ​por shadow al hacerlo, ​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.
cpp-avanzado/macros.1701269890.txt.gz · Última modificación: 2023/11/29 14:58 por santo