Declaraciones y asignación de valores iniciales

Responder
Mensaje
Autor
gorkau
Site Admin
Mensajes: 396
Registrado: 13/08/2002 11:00 pm
Ubicación: Bilbao
Contactar:

Declaraciones y asignación de valores iniciales

#1 Mensaje por gorkau » 14/04/2007 9:55 am

· 1.1: ¿Cómo se decide qué tipo de enteros usar?

El compilador es un programa que nos permite convertir nuestro código fuente (los programas que escribimos) en un programa ejecutable. Es el encargado de traducir nuestro código fuente al 'idioma' del ordenador.

Existen multitud de compiladores de C/C++, unos gratuitos y otros comerciales. Los gratutitos no desmerecen de los comerciales, y en algunos casos son incluso superiores a éstos.

Un compilador crea programas para el sistema operativo en el que trabaja (DOS, Windows, Linux,...), aunque algunos pueden crearlos para otros distintos (son los compiladores cruzados).

· 1.4: ¿Cómo debe ser el tipo de 64 bits en una máquina que lo admita?

R: La próxima revisión del estardar C (C9X) espacifica que el tipo long long debe ser como mínimo de 64 bits, y este tipo ha sido implementado por un gran número de compiladores desde hace ya tiempo (otros han implementado extensiones tales como __longlong). Por otra parte, no hay ninguna razón teórica por la que un compilador no pudiera implementar el tipo short int como 16, int como 32, y long int como 64 bits, y algunos compiladores optan por esta opción.

Ver también la pregunta 18.15d.

Referencias: C9X Sec. 5.2.4.2.1, Sec. 6.1.2.5.

· 1.7: ¿Cuál es la mejor forma de declarar y definir variables globales y funciones?

R: Aunque puede haber varias "declaraciones" de una misma variable o función "global" (hablando estrictamente, "externa"), debe haber una única "definición". (La definición es la declaración que reserva espacio y establece un valor inicial, si es que hay alguno). La mejor forma de hacerlo es colocar cada definición en algún fichero .c relevante, con una declaración externa en un fichero de encabezamiento (.h), que será incluido (con #include) allá donde la declaración se necesite. El fichero .c que contiene la definición tambíen debería incluir (#include) el fichero de encabezamiento, para que el compilador pueda comprobar que la definición concuerda con las declaraciones.

Esta regla proporciona un gran grado de portabilidad: es consistente con los requierimientos del ANSI C Estándar, y también con la mayoría de los compiladores y enlazadores (linkers) pre-ANSI. (Los compiladores y enlazadores Unix usan normalmente un "modelo común" que permite múltiples definiciones, siempre y cuando se inicialice uno como máximo; este comportamiento es mencionado en el ANSI C Estandar como "extensión común". Unos pocos y extraños sistemas puede que requieran un inicializador para distinguir una definición de una declaración externa.
It is possible to use preprocessor tricks to arrange that a line like DEFINE(int, i); need only be entered once in one header file, and turned into a definition or a declaration depending on the setting of some macro, but it's not clear if this is worth the trouble. It's especially important to put global declarations in header files if you want the compiler to catch inconsistent declarations for you. In particular, never place a prototype for an external function in a .c file: it wouldn't generally be checked for consistency with the definition, and an incompatible prototype is worse than useless. Ver también las preguntas 10.6 y 18.8. Referencias: K&R1 Sec. 4.5 pp. 76-7; K&R2 Sec. 4.4 pp. 80-1; ISO Sec. 6.1.2.2, Sec. 6.7, Sec. 6.7.2, Sec. G.5.11; Rationale Sec. 3.1.2.2; H&S Sec. 4.8 pp. 101-104, Sec. 9.2.3 p. 267; CT&P Sec. 4.2 pp. 54-56.

· 1.11: ¿Qué significa extern en la declaración de una función?

R: Puede ser usado como una pista para indicar que la definición de la función está probablemente en otro fichero fuente, pero no hay ninguna diferencia formal entre:

extern int f();

y

int f();

Referencias: ISO Sec. 6.1.2.2, Sec. 6.5.1; Rationale Sec. 3.1.2.2; H&S Secs. 4.3,4.3.1 pp. 75-6.-

· 1.12: ¿Para qué sirve la palabra clave 'auto'?

Para nada, está obsoleta. Ver pregunta 20.37.

Referencias: K&R1 Sec. A8.1 p. 193; ISO Sec. 6.1.2.4, Sec. 6.5.1; H&S Sec. 4.3 p. 75, Sec. 4.3.1 p. 76.


· 1.14: No consigo definir una lista enlazada con éxito...1.14: No consigo definir una lista enlazada con éxito...

He probado con

typedef struct {
char *item;
NODEPTR next;
} *NODEPTR;


Pero el compilador me da mensajes de error. ¿Acaso no puede una estructura en C contener un puntero a si misma?


R: Por supuesto que sí pueden contener punteros a sí mismas; Los comentarios y el ejemplo de la sección 6.5 del libro de K&R lo dejan claro. El problema con este ejemplo es que el typedef no ha sido definido en el punto dondese declara el campo "next". Para arreglar este código, primero etiqueta a la estructura como "struct node". Luego declara el campo "next" como "struct node *", o libra a la declaración typedef de la definición de la estructura, o ambos. Una posible forma sería:

struct node {
char *item;
struct node *next;
};

typedef struct node *NODEPTR;


Y hay por lo menos otras tres formas equivalentes de hacerlo.

Un problema similar, con una solución similar, puede surgir cuando se intenta declara un par de estructuras typedef que hacen referencia la una a la otra.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado