C Programming Language Specification (c)

7. constantes, variables y estructuras

Regla 7-1 sentido intuitivo para hacer uso de esas figuras para representar constante de cadena o varias veces en el programa.

Regla 7-2 requiere constantes públicamente en archivos de cabecera, sin constantes definidas públicamente en los archivos de cabecera.

Regla 7-3 no es necesario retirar las variables públicas.
Descripción: variable común es una de las razones del aumento del acoplamiento entre los módulos, se debe reducir la variable común innecesaria para reducir el acoplamiento entre los módulos.

Regla 7-4 no utilizan como variables sin inicializar el valor correcto.
Descripción: En particular asignación sin puntero de referencia en C, a menudo causa fallos del sistema.

7-5 estructura característica regular para ser única , se dirige a un asuntos abstractos.
Descripción: El diseño de la estructura debe esforzarse por hacer que la estructura representa una abstracción transacción realista, no representan al mismo tiempo una gran variedad. Cada estructura de elemento debe representar diferentes aspectos de la misma transacción, y no debe ser descrito en diferentes transacciones ninguna relación o elementos débiles en la misma estructura.

7-6 reglas de diseño no cubren todo, una muy flexible estructura de datos.
Ejemplo: El siguiente estructura no es clara y razonable.

typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned charteacher_name[8]; /* the student teacher's name */
unisgned charteacher_sex; /* his teacher sex */
} STUDENT;

Si se lee de la siguiente manera, puede ser más razonable.

typedef struct TEACHER_STRU
{
unsigned char name[8]; /* teacher name */
unisgned char sex; /* teacher sex, as follows */
/* 0 - FEMALE; 1 - MALE */
} TEACHER;

typedef struct STUDENT_STRU
{
unsigned char name[8]; /* student's name */
unsigned char age; /* student's age */
unsigned char sex; /* student's sex, as follows */
/* 0 - FEMALE; 1 - MALE */
unsigned int teacher_ind; /* his teacher index */
} STUDENT;

7-7 el número de elementos en la estructura de la norma debe ser moderada. Si el número de elementos estructurales de acuerdo con ciertos principios puede considerarse mucho los diferentes sub-estructuras de elementos para reducir el número de elementos en la estructura original.

Regla 7-8 de la conversión del tipo de datos predeterminado sistema de construcción, sino también tener una comprensión completa.

Entre 7-9 reglas con y sin signo, entero y el tipo de punto flotante entre, de gran angular a Tipo Tipo estrecha, parámetros de la función, la función devuelve la expresión, no hay expresiones complejas conversión implícita.

7-10 valor entero de un complejo de reglas de expresión solamente a tipo estrecho fundido y el tipo de base de la expresión tienen el mismo signo.
Si el molde a utilizar en cualquier expresión compleja, el tipo de conversión puede ser aplicado debe ser estrictamente limitada. Por ejemplo, como sigue:

(uint32_t) (u16a + u16b) 		/* not compliant */
(uint32_t) u16a + u16b 		/* compliant */
(uint32_t) u16a + (uint32_t) u16b /* compliant */

Cuando la declaración regla de 7-11 cuando se utiliza en un entorno distribuido o estructuras de datos y diferentes entornos de la comunicación entre la CPU, la máquina debe considerar el campo de bits orden de bytes y problemas de alineación de bytes tal uso.

8. Diseñador de macros

Funciona única regla se amplía con 8-1 apoyos C inicialización expresión constante entre paréntesis, un calificador tipo, el identificador de clase de almacenamiento o estructura do-while-cero.

Estas macros se utilizan entre todos forma permisible. identificador de clase de almacenamiento incluye calificadores de tipo y palabras clave tales como extern, estática y const. Cualquier otra forma de #define podría conducir a un comportamiento inesperado, o es muy difícil de entender el código.

En particular, la macro no se puede utilizar para definir una parte de la declaración o declaraciones, además de hacer, mientras que la estructura. Las macros no puede ser redefinido la gramática de la lengua. Todos los soportes de reemplazar la lista de macros, independientemente de qué tipo de (), {}, [] debe ser de dos en dos. do-while-cero estructura (ver ejemplo a continuación) en el estado de macro es el cuerpo formulario sólo aceptable que tiene una declaración completa. do-while-cero secuencia y estructura para encerrar declaración para asegurarse de que es correcta. Nota: Es necesario omitir el punto y coma al final del cuerpo de la declaración macro.
Por ejemplo:

/* The following are compliant */
#define PI 3.14159F /* Constant */
#define XSTAL 10000000 /* Constant */
#define CLOCK (XSTAL / 16) /* Constant expression */
#define PLUS2(X) ( (X) + 2 ) /* Macro expanding to expression */
#define STOR extern /* storage class specifier */
#define INIT(value) { (value), 0, 0 } /* braced initialiser */
#define READ_TIME_32 () \
do { \
DISABLE_INTERRUPTS (); \
time_now = (uint32_t) TIMER_HI << 16; \
time_now = time_now | (uint32_t) TIMER_LO; \
ENABLE_INTERRUPTS (); \
} while (0)	 /* example of do-while-zero */

Regla 8-2 llamadas las macros de función no puede prescindir de los parámetros.
Se trata de un error de restricción, pero el preprocesador saber e ignorar este problema. Composición función macro para cada parámetro debe tener al menos un pre-marcado, o su comportamiento no está definido.

8-3 regla que define una macro función, cada instancia del parámetro debe ser encerrada entre paréntesis.
Función-como definiciones de macro, el parámetro debe ser encerrado entre paréntesis. Abs ejemplo, una función se puede definir como:
#define abs (X) (((X)> = 0) (X): -? (X))
no puede ser definido como:
#define abs (X) (((X)> = ? 0) x: -x)

Publicado 56 artículos originales · ganado elogios 75 · Vistas de 300.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44710568/article/details/105265769
Recomendado
Clasificación