Cómo definir un símbolo de preprocesador en Xcode

100

¿Es posible establecer un símbolo para la compilación condicional configurando propiedades en un proyecto de Xcode?

Mi objetivo es crear un símbolo que esté disponible para todos los archivos, sin tener que usar importar / incluir, de modo que un conjunto de clases comunes pueda tener un comportamiento especial en algunos proyectos. Como el siguiente, pero con mis propios símbolos.

#if TARGET_IPHONE_SIMULATOR
    ...
#endif
Steph Thirion
fuente

Respuestas:

116

Vaya a la configuración de su objetivo o proyecto, haga clic en el icono de engranaje en la parte inferior izquierda y seleccione "Agregar configuración definida por el usuario". El nuevo nombre de configuración debería ser GCC_PREPROCESSOR_DEFINITIONS, y puede escribir sus definiciones en el campo de la derecha.

Según los comentarios de Steph, la sintaxis completa es:

constant_1=VALUE constant_2=VALUE

Tenga en cuenta que no necesita el '=' si solo desea #definir un símbolo, en lugar de darle un valor (para #ifdefdeclaraciones)

Ben Gottlieb
fuente
2
¡Gracias! Para quien esté interesado, la sintaxis se parece a "kVarOne = 5 myVar = 3.0" (sin las comillas), la encontré por ensayo y error. Ben, ¿podrías editar tu respuesta para especificar eso? Gracias de nuevo.
Steph Thirion
1
Increíble respuesta. Todavía tengo cabello por esto. Gracias, gracias, gracias. +1 (Ojalá pudiera ser más)
Ali Parr
11
Para su información, a partir de Xcode 3.2.4, las "Macros de preprocesador" se asignan a GCC_PREPROCESSOR_DEFINITIONS, y Xcode ya no le permitirá realizar una definición de usuario (ya que ya está disponible).
Clay Bridges
11
Este ya no es un ícono de engranaje en la parte inferior izquierda, sino un ícono de más en la parte inferior derecha (de la pestaña Configuración de compilación de su objetivo).
Jesse Smith
1
debe actualizar esta respuesta. ya no hay icono de engranaje
Radu Simionescu
86

No es necesario crear una configuración definida por el usuario. La configuración incorporada "Macros de preprocesador" funciona bien. texto alternativo http://idisk.mac.com/cdespinosa/Public/Picture%204.png

Si tiene varios objetivos o proyectos que usan el mismo archivo de prefijo, use Macros de preprocesador no utilizadas en encabezados precompilados, de modo que las diferencias en la definición de su macro no activen un conjunto adicional innecesario de encabezados precompilados.

cdespinosa
fuente
1
¿Qué haces si falta esta sección en la configuración de compilación?
Kevin Laity
3
Haz lo que sugiere Ben Gotliebb. Pero a partir de la versión 3.2.4 de Xcode, las "Macros de preprocesador" se asignan a GCC_PREPROCESSOR_DEFINITIONS. No puede definir por el usuario algo que ya esté disponible.
Clay Bridges
41

Como apéndice, si está utilizando esta técnica para definir cadenas en su objetivo, así es como tuve que definirlas y usarlas:

En Build Settings -> Preprocessor Macros, y sí, las barras invertidas son críticas en la definición:

APPURL_NSString=\@\"www.foobar.org\"

Y en el código fuente:

objectManager.client.baseURL = APPURL_NSString;
Stickley
fuente
Gracias por esta solución, he estado buscando algo EXACTAMENTE como esto, pero el desbordamiento de pila está lleno de soluciones demasiado complicadas.
David P
5

Puede utilizar el *_Prefix.pcharchivo para declarar macros de todo el proyecto. Ese archivo suele estar en su grupo Otras fuentes .

chunkyguy
fuente
3

Está en "GCC 4.2 Preprocessing" (o simplemente ponga "prepro" en el cuadro de búsqueda) ...

... sin embargo, por mi vida no puedo hacer que funcione.

Tengo mis configuraciones estándar de depuración y lanzamiento, y quiero definir DEBUG = 1 en la configuración de depuración. Pero después de agregarlo como valor:

(en la ventana de configuración)> Macros de preprocesador: DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

... nunca imprime / recibe llamadas. Me esta volviendo loco...

Choque de cabeza
fuente
10
En lugar de #if DEBUG, intente #if definido (DEBUG) o #ifdef DEBUG
Simo Salminen
Curiosamente, me encontré aquí en 2019, con Swift y Xcode 10.3. Cualquiera con el mismo problema descrito anteriormente puede encontrar esto útil; ciertamente me dio #if DEBUGvida :) stackoverflow.com/a/47395485/2778502
jeff-h
1

En respuesta al comentario de Kevin Laity (ver la respuesta de cdespinosa), acerca de la sección de preprocesamiento de GCC que no se muestra en la configuración de su compilación, haga que Active SDK sea el que dice (Base SDK) después y aparecerá esta sección. Puede hacer esto eligiendo el menú Proyecto> Establecer destino activo> XXX (SDK base). En diferentes versiones de XCode (Base SDK) puede ser diferente, como (Configuración del proyecto o Predeterminado del proyecto).

Después de que aparezca esta sección, puede agregar sus definiciones a las macros del procesador en lugar de crear una configuración definida por el usuario.

Mark24x7
fuente
1

Para proyectos Xcode 9.4.1 y C ++. Agregar const char*macros de preprocesador a las compilaciones de depuración y versión .

  1. Seleccione su proyecto

    seleccionar proyecto

  2. Seleccionar configuración de compilación

    seleccionar configuración de construcción

  3. Buscar " Macros de preprocesador "

    búsqueda1 búsqueda2

  4. Abrir lista interactiva

    abrir lista interactiva

  5. Agregue sus macros y no olvide escapar de la cita

    agregar ruta

  6. Usar en el código fuente como común const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...
Petr Javorik
fuente
0

Puede duplicar el destino que tiene la sección de preprocesamiento, cambiarle el nombre a cualquier nombre que desee y luego cambiar el valor de la macro de preprocesador.

kslcam
fuente