En sistemas con recursos limitados (como un PIC de 8 bits), ¿hay algún beneficio en usar sus propias macros para verdadero y falso en lugar de usar los definidos en stdbool?
Las macros son evaluadas por el pre-compilador antes del tiempo de compilación, no por el compilador o micro en tiempo de ejecución. Una macro definida como "1" se reemplazará por "1" antes de que el compilador empiece a intentar averiguar cómo optimizar su código. A menos que su macro sea mejor que la macro stdbool, no hay beneficio.
¿Cómo se comparan en términos de uso de RAM? Uso de la pila?
1 == 1, independientemente de cómo se define la macro. No hay diferencia.
¿Portabilidad de código?
Al usar macros no estándar, la portabilidad del código sufre. Su código necesitará sus definiciones / encabezados, por lo que alguien no puede copiar y pegar una sección que parece estándar sin obtener errores. Especialmente con algo como "Verdadero" o "Falso".
¿Simplicidad de código?
Si no necesitas todos los stdbool, seguro, definir el tuyo puede ser más simple. Eso es realmente una cuestión de opinión.
Actualización:
En cuanto al uso de la pila, quiero preguntar ¿qué se devuelve en cada caso? 8bits? 16bits? Registrar el tamaño del microcontrolador?
Esta es una mejor pregunta. Es un poco complicado. Primero, "bool" es realmente una macro para "_Bool", un tipo de datos c99. Normalmente, _Bool es el objeto direccionable más pequeño capaz de contener un 0 o un 1. Es un char, un objeto de 8 bits. (Las cosas como los nibbles son objetos demasiado complicados que requieren un código de fondo para dividir un solo carácter de 8 bits en dos objetos "separados" de 4 bits). _Bool también tiene algo de lógica en donde es 0 cuando 0, o 1 cuando algo sobre o debajo de 0. _bool random_variable = 5
daría como resultado una variable aleatoria igual a 1. En cuanto a la memoria, ese valor será de 8 bits, pero devolverá el literal 0 o 1.
Segundo, verdadero y falso, como ha creado la macro para, son exactamente lo mismo que stdbool.h define verdadero y falso. Un 0 o 1 literal. Los intergers literales son, por defecto, los tipos de datos int . int no es un estándar fijo. Puede ser definido por su IDE, compilador o idioma. Cambia según el fabricante del microcontrolador o incluso la línea de microcontroladores del mismo fabricante. También puede estar firmado o sin firmar por los mismos motivos (consulte: enlace ) Entonces, a menos que si escribes una variable cuando asignas true
o false
, se enviará a int. Pero uint8_t es un tipo de datos stdint.h sin firma de 8 bits también.
Tercero, tus dos funciones no son exactamente iguales. Tenga en cuenta que IsThisGood devuelve un tipo bool (really _Bool) (objeto char / 8 bit). IsThisBetter devuelve un tipo uint8_t (8 bits). En la práctica, lo mismo, pero el tipo _Bool tiene lógica para hacer algo mayor que 0 = 1, mientras que uint8_t no lo hace. IsThisBetter técnicamente podría devolver 255 por alguna razón.
Finalmente, si por alguna razón "char" en tu microcontrolador / ide / compiler / language es mayor que 8 bits, entonces tu versión uint_8 será más pequeña, en cuanto a memoria, pero aún carecerá de la lógica "mayor que 0 = 1" .
Vea esta respuesta de desbordamiento de pila en el tamaño de _Bool: enlace