Una ligera modificación de la sugerencia de @Krizz, para que funcione correctamente si el archivo de encabezado de constantes se va a incluir en la PCH, lo cual es bastante normal. Dado que el original se importa a la PCH, no lo volverá a cargar en el .marchivo y, por lo tanto, no obtendrá símbolos y el enlazador no está satisfecho.
Sin embargo, la siguiente modificación le permite funcionar. Es un poco complicado, pero funciona.
Necesitará 3 archivos, .harchivo que tiene las definiciones constantes, el .harchivo y el .marchivo, usaré ConstantList.h, Constants.hy Constants.m, respectivamente. los contenidos de Constants.hson simplemente:
// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"
y el Constants.marchivo se ve así:
// Constants.m
#ifdef STR_CONST
#undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"
Finalmente, el ConstantList.harchivo tiene las declaraciones reales y eso es todo:
// ConstantList.h
STR_CONST(kMyConstant, "Value");
…
Un par de cosas a anotar:
Tuve que redefinir la macro en el .marchivo después de #undef haberla usado para que se usara la macro.
También tuve que usar en #includelugar de #importesto para que funcione correctamente y evitar que el compilador vea los valores previamente compilados.
Esto requerirá una recompilación de su PCH (y probablemente de todo el proyecto) cada vez que se modifiquen los valores, lo que no es el caso si están separados (y duplicados) como es normal.
Espero que sea útil para alguien.