#55 No es solo Rust, tambien Zig ( y de forma, quiza, mas elegante ), eso son encapsuladores ( mas o menos intrinsecos del lenguaje ) donde hay un enumerativo o booleano adherido al resultado del typo que sea. Enums, Options, Errors,... puedes trabajar incluso en C con construcciones similares. Basicamente donde tienes un:
#62 La idea no es la de ir a joder. C/C++ como cualquier lenguaje permite hacer bucles infinitos, pero hacerlos cuando no toca es problema del programador y no del lenguaje. Los define normalmente se usan para cosas como "#define PI 3.1416f" y así puedes usar el valor de PI habiendolo definido una única vez (sin tener que crear una variable/constante). Puedes hacer cosas como "#define for_i_10 for (int i=0;i<10;i++)" y crear bucles más rápido, aunque no se recomienda por razones obvias.
¿Por qué puedes cambiar palabras reservadas? Bueno, allá cada quién, no parece sensato pero en C no hay límites.
Lo cierto es que si usas este fichero el programa fallará en cualquier test que hagas, por muy básico que sea.
Pero por muy grande que sea el commit cuando encuentre el archivo se lo cargan y listo.
Lo diabólico sería ir repartiendo los define por los diferentes headers del proyecto. Uno aquí otro allá...
Hace mucho que no toco C/C++, pero solo se podían poner los #define en los .h? O también se podían meter en los archivos .c/.cpp (los compilados)?
Como se pudieran meter en los cpp entonces sí .
Por cierto yo al menos que he trabajado para 2 bancos y ahora para una empresa del Ibex35 firmas un montón de políticas que básicamente dicen que como hagas esto vas a la cárcel .
#146
Son programas para distintos sistemas operativos, entre ellos GNU con Linux, Musl con Linux y uClibc con Linux.
No son programas para Linux. El ELF no define el sistema operativo para el que está diseñado un programa como tampoco lo define el valor del parámetro EL_OSABI (ELFOSABI). Lo que define es para qué núcleo de sistema operativo o sistema operativo se ha generado el binario.
Está bien que ignores todo lo que se te ha rebatido. Sigue así, llegarás lejos. ¿Te crees que los demás son tontos o qué?
Los valores hard coded no son definitorios (como tampoco lo es el GNU/Linux que aparece al ejecutar el comando uname -o). De todas maneras pongo aquí cómo está definido EI_OSABI y sus posibles valores. El valor 0x03 de EI_OSASBI se corresponde con ELFOSABI_GNU.… » ver todo el comentario
#70 No tiene ningún sentido lo que dices. La función socket espera una serie de parámetros, y cuando metes AF_NETLINK lo que hace es que tiene una definición de que AF_NETLINK = 16. Y eso se le pasa al kernel tal cual le llega (hazme caso, que he comprobado el código)
Si en vez de meterle AF_NETLINK le metes 127 (que cabe) glibc se lo pasa igual al kernel, otra cosa es que el kernel luego te devuelva un error.
Ahora, si netlink es GNU porque porque la gente de glibc ha añadido una linea que pone #define AF_NETLINK 16
Pues ahi ante esa lógica aplastante ya no digo nada.
> Nótese que GNU Hurd también soportará Netlink
HURD tambien soporta TCP y creo que no por ello nadie diria que TCP es GNU.
#65 Se diseñó para gestionar interfaces de redes en linux. Netlink lo implementa Alexey Kuznetsov[1] porque necesita un mecanismo para comunicarse entre el kernel y userspace y ninguna de las alternativas existentes era satisfactoria [2]. Y el mismo Alexey Kuznetsov hace iproute2[3].
Es completamente ABSURDO hablar de GNU y netlink cuando netlink es un tipo de socket, de modo que se implementa en kernelspace y lo unico que hace glibc es que cuando llamas a socket te admite en el protocolo AF_NETLINK, que al final es meter en la lista de protocolos una entrada con #define AF_NETLINK 16 (si, he ido a buscarlo)
Otra cosa es que algunos BSD hayan implementado netlink porque les convenció igual que linux probablemente acabe implementando pledge de openBSD.
#24 Los genéricos (generics o templates en inglés) son una forma de generar código en tiempo de compilación. En C se hacía (y se hace) mediante macros. Si en C se define algo como:
todas las apariciones de MY_MACRO son resueltas por el preprocesador de C sustituyendo dicho valor por su contenido (call_to…). El problema de esto es que el compilador no tiene ni idea del símbolo MY_MACRO, ya que es resuelto por el preprocesador antes de que el compilador entre en juego. Esto conlleva ciertos problemas, como la ocultación de ciertos errores y el reporte de los mismos (se vuelve muy críptico).
Para solucionarlo se inventaron los generics, que no son más que una forma que tiene el compilador de… » ver todo el comentario
TypoDeValorADevolver NombreDeFuncion( parametros... )
{
...
}
Pasas a
#define ERRORADDED(type) typedef ERRORADDED_##type { BOOLEAN Error; type Result; }
#define ONERROR(x) if (((ERRORADDED_##type )(x)).Error)
ERRORADDED(TypoDeValorADevolver);
ERRORADDED_TypoDeValorADevolver NombreDeFuncion( parametros... )
{
...
}
ONERROR(NombreDeFuncion( parametros... ))
{
}
O bueno, muchas cosas del estilo... lo bueno de Rust, Zig y demas es que esto esta naturalizado en el lenguaje, pero ser no es gran cosa...