2012-06-08 20 views
13

En la cabecera de la clase, fuera de la declaración de interfaz, he declarado constantes globales:Duplicar error de símbolo - mundial constante

NSString * const gotFilePathNotification = @"gotFilePath"; 
NSString * const gotResultNotification = @"gotResultOfType"; 

gotResultNotification sólo se utiliza en esta clase (aún), pero Referencia gotFilePathNotificaion en otra implementación de clase. Para hacerlo, importo este encabezado.

Cuando intento compilar, obtengo un error de enlazador de símbolos duplicados sobre gotFilePathNotification en este encabezado. ¿Por que sucede?

Respuesta

26

Tiene dos identificador (es) con el mismo nombre en dos unidades de compilación diferentes en el alcance del archivo. Esto infringe . En su lugar, necesita -

  1. Declarar las variables globales que marcan para tener un enlace externo en un archivo de encabezado.

    extern NSString * const gotFilePathNotification; 
    
  2. ofrecen ahora la definición de única archivo de una fuente.

    NSString * const gotFilePathNotification = @"gotFilePath"; 
    

Ahora que cada vez que necesita usar estas variables, incluyen el encabezado del archivo de origen.

5

Debe declararlos extern en el archivo de encabezado y definirlos en el archivo de implementación. Vea esta pregunta para aclaración. Global Variables in Cocoa/Objective-C?.

La segunda respuesta proporciona la aclaración que voy a reiterar aquí. El calificador de almacenamiento predeterminado para las variables es estático. Esto significa que cuando intenta vincular dos archivos diferentes con la misma variable, como sucederá cuando importa el archivo de encabezado, el vinculador interpretará que la variable está definida de forma múltiple.

+0

El calificador de almacenamiento predeterminado es ** no ** estático. Si lo fuera, entonces no tendrías un error de enlazador. Una variable estática tiene un enlace interno. Entonces, si dos unidades de traducción definen una variable estática con el mismo identificador, entonces cada una de ellas tiene una variable separada. –

4

También asegúrese de incluir el archivo h y no el archivo m. Esto me estaba volviendo loco.

Cuestiones relacionadas