Quiero hacer esto:
typedef register unsigned int _newint; Básicamente, un alias conciso de register unsigned int as _newint .
Pero se produce un error, "no se puede especificar más de una clase de almacenamiento", subrayando el register .
Quiero saber si puedo hacer esto o no; ¿Si es así, entonces cómo?
Por extraño que parezca, la palabra clave typedef es en realidad un especificador de clase de almacenamiento (y, como indica el mensaje de error, no puede tener un segundo especificador de register en la misma instrucción). De este Proyecto de Norma C11 :
6.7.1 Especificadores de clase de almacenamiento
…
5 El especificadortypedefse llama ''especificador de clase de almacenamiento'' solo por conveniencia sintáctica; se trata en 6.7.8. Los significados de los diversos enlaces y duraciones de almacenamiento se discutieron en 6.2.2 y 6.2.4.
Si, a pesar de la redacción del párrafo citado anteriormente, encuentra esto inconveniente , entonces considere por qué desea agregar un especificador de clase de almacenamiento a un typedef . Lo más probable es que el código sea más claro si agrega el especificador de register (o cualquier otro calificador) a las variables reales , cuando se declaran:
typedef unsigned int _newint; void foo(void) { register _newint MyNewInt; //... } 'Ocultar' ese especificador de register en un alias puede causar problemas a los futuros lectores de su código, quienes luego no pueden entender por qué agregar un especificador diferente a una variable de ese tipo causa problemas.
Quiero saber si puedo hacer esto o no, si es así, ¿cómo?
Tanto typedef como register cuentan como clases de almacenamiento, aunque eso es un tecnicismo en el caso de typedef . No puede declarar que ningún identificador tenga más de una clase de almacenamiento, por lo que la respuesta directa es no, no puede hacer eso.
Posiblemente podría usar una macro en lugar de un typedef para lograr un efecto similar:
#define _newint register unsigned int void foo() { _newint x; }Eso es engañoso, sin embargo, por lo que no debería.
De manera más general, probablemente no debería usar la clase de almacenamiento de register en absoluto. Los compiladores modernos no necesitan su ayuda para averiguar qué variables almacenar en los registros, y el register es solo una pista, por lo que el único efecto notable es que se le impide (por regla) tomar la dirección de un objeto declarado con ese almacenamiento clase.