Una solución alternativa que funciona razonablemente bien es usar mayúsculas para todos los nombres de tipos y macros. Las variables globales pueden ser CapCase (CamelBack) y todas las variables locales en minúsculas.
Esta técnica ayuda a mejorar la legibilidad y también aprovecha la sintaxis del lenguaje que reduce el número de caracteres contaminantes en los nombres de las variables; p.ej. gvar, kvar, type_t, etc. Por ejemplo, los tipos de datos no se pueden confundir sintácticamente con ningún otro tipo.
Las variables globales se distinguen fácilmente de las locales al tener al menos una letra mayúscula.
Acepto que los subrayados prefijados o postfijo deben evitarse en todos los nombres de tokens.
Veamos el ejemplo a continuación.
Está claro que InvertedCount es global debido a su caso. Está igualmente claro que INT32U y RET_ERR son tipos debido a su sintaxis. También está claro que INVERT_VAL() es una macro debido a que está en el lado derecho y no hay ningún molde, por lo que no puede ser un tipo de datos.
Una cosa es segura. Cualquiera que sea el método que use, debe estar en línea con el estándar de codificación de su organización. Para mí, la menor cantidad de desorden, mejor.
Por supuesto, el estilo es un problema diferente.
#define INVERT_VAL(x) (~x)
#define CALIBRATED_VAL 100u
INT32U InvertedCount;
typedef enum {
ERR_NONE = 0,
...
} RET_ERR;
RET_ERR my_func (void)
{
INT32U val;
INT32U check_sum;
val = CALIBRATED_VAL; // --> Lower case local variable.
check_sum = INVERT_VAL(val); // --> Clear use of macris.
InvertedCount = checksum; // --> Upper case global variable.
// Looks different no g prefix required.
...
return (ERR_NONE);
}
¿No sugiere esto utilizar exactamente la misma convención con la que el OP tiene un problema? Parece estar respondiendo una pregunta diferente a la preguntada, que se centra en los tipos. –