2012-02-08 7 views
8

Tengo muchos sensores de 3 ejes diferentes para los que estoy escribiendo un código de prueba. En los archivos de C para cada uno de ellos, tengo la misma cadena de carbón definido:¿Cómo se define una matriz de cadenas de caracteres en el archivo de encabezado?

char axis[3][8] = {"X", "Y", "Z"} 

que utilizo cuando "para" Resultados de bucle I para imprimir el eje que está fallando así:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]); 

Estaba pensando en ahorrar algo de espacio. Podría definir una matriz de cadenas de caracteres en un archivo de cabecera para usar en cualquier lugar.

He intentado varias cosas, pero parece que no puedo obtener una serie de cadenas definidas en mi archivo de encabezado que pueda repetir para pasar una compilación.

Respuesta

10

Con el fin de evitar errores de enlace, usted tiene que declarar su matriz como extern en un fichero de cabecera, y luego definir la matriz vez en uno de sus módulos de código.

Así, por ejemplo:

//myheader.h 
extern const char* axis[3]; 

continuación, en otro módulo de código en algún lugar:

//myfile.c 
const char* axis[3] = { "X", "Y", "Z" }; 
+0

ah que tiene sentido pero parece bassackwards ... Así que el archivo de encabezado que incluyo en todas partes señala todos los otros archivos C a la definición local "myfile.c". – user1054210

+0

Entonces, aunque he incluido el archivo de encabezado en los otros archivos c, recibo un error de compilación "refrence indefinido". Entonces en myheader.h tengo >> extern char * AXIS [3] [8]; y en myfile.c Tengo >> char * AXIS [3] [8] = {{"X"}, {"Y"}, {"Z"}}; y estoy incluyendo el myheader.h en otherfile.c. También intenté algunos otros trucos pero no están sincronizando. – user1054210

+0

Algo más está mal entonces porque esto funciona ... ¿qué sucede si saca la macro de la ecuación y simplemente intenta acceder a la matriz en otro módulo de código que incluya el archivo de encabezado? En segundo lugar, debería ser 'const char * AXIS [3] = {" X "," Y "," Z "};' ya que estos son literales de cuerdas ... ¿de dónde sacas el '8'? – Jason

19

Si tiene que ponerlo en un archivo de cabecera, utilice extern o static:

// option 1 
// .h 
extern char axis[3][8]; 

// .c 
char axis[3][8] = { "X", "Y", "Z" }; 

// option 2 
// .h 
static char axis[3][8] = { "X", "Y", "Z" }; 

Extern le dice al vinculador que hay una variable global llamada axis definido en uno de nuestros archivos de implementación (es decir en un archivo .c), y necesito hacer referencia a eso aquí.

static, por el contrario, le dice al compilador lo contrario: Necesito poder ver y usar esta variable, pero no exportarla al enlazador, por lo que no puede ser referenciada por extern o causa nombrando conflictos.

2

poner esto en el archivo de cabecera

extern char axis[3][8]; 

y tener esto en un fichero C:

char axis[3][8] = {"X", "Y", "Z"}; 
2

Agregar a su cabecera:

extern char *axis[]; 

Añadir esto a uno archivo fuente en su proyecto:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" }; 
+0

¡Bien hecho! Utilizo esto cuando necesito crear un menú 'con un número indefinido de elementos. Es perfecto porque en tiempo de compilación el compilador configura la longitud de la matriz exactamente, además el código parece ser mucho más legible. – b3h3m0th

0

Michael Barr (Netrino) desaconseja la declaración de almacenamiento en un archivo de encabezado. Del mismo modo, el estándar de codificación del sistema integrado Netrino no condonar el uso de almacenamiento externo en los encabezados.

Generalmente estoy de acuerdo con estos principios, y he encontrado que es una buena idea externar el almacenamiento en los archivos C que lo necesitan, y solo eso.

Cuestiones relacionadas