2012-05-28 42 views
5

He leído muchas definiciones de # if y # statement statement.
He intentado utilizar la forma en que he leído, pero sólo con el error "Elemento inválido al comienzo de una expresión del preprocesador" en la línea que lo define como un comentario a continuación:#define o #if error de declaración

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#define is_ipad   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define is_ipad_hd  ((is_ipad == 1 && [UIScreen mainScreen].bounds.size.width > 1024) ? YES : NO) 
#define is_iphone_hd ([UIScreen mainScreen].bounds.size.width > 480 ? YES : NO) 
#define device_width 480.0f 
#define device_height 320.0f 

#if (is_ipad_hd == YES) // Error here 
    #define device_width  = 2048.0f 
    #define device_height  = 1496.0f 
#endif 

Por qué funciona en tutoriales simples y cuando intentamos algo más complejo, ¡suceden estas cosas!

+4

Las directivas del preprocesador se evalúan antes de la compilación; tan claramente que no pueden operar con información de tiempo de ejecución. (No sé el Objetivo C, pero '[UIScreen mainScreen] .bounds.size.width' suena como algo en tiempo de ejecución ...) –

+0

Ok, ahora lo entiendo. Entonces, ¿cómo especifico el tamaño de la pantalla del dispositivo? Disculpa mi lentitud, porque algunas técnicas de investigación en inglés son difíciles de traducir y se ven como debería. –

Respuesta

4

¡Estas son directivas de preprocesador, por lo que no tiene acceso a los métodos [UIScreen mainScreen] y a todos los demás objetos definidos al compilarlos!

1

La evaluación de macros ocurre en tiempo de compilación.

Sin embargo, (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) o [UIScreen mainScreen] solo se pueden interpretar en tiempo de ejecución.

Más allá de eso, no debe confiar en el tamaño de la pantalla para hacer su trabajo sucio por usted. En su lugar, debe confiar en el idioma de interfaz de usuario y la escala de la pantalla principal:

BOOL isiPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; 
BOOL isHD = [[UIScreen mainScreen] scale] == 2.0; 

if (isiPad) { 
    if (isHD) { 
    // retina iPad 
    } else { 
    // non-retina iPad 
    } 
} else { 
    if (isHD) { 
    // retina iPhone/iPod touch 
    } else { 
    // non-retina iPhone/iPod touch 
    } 
} 
+0

Así que me gustaría configurarlo una vez, así que quería usar # define y # if. Bueno, no sé si es factible usar un encabezado simple, como su ejemplo, y procesar en cada escena. Si esto es correcto de lo que estoy hablando. gracias –

+0

Seguí su sugerencia, pero ¿no estaría mal todo el tiempo para verificar y establecer las variables en todo momento? ¿Hay una manera más simple? –

0

de acuerdo con otros aquí, aunque no soy tan versado en el preprocesador de C un google rápida regresó con esto:

expresión es una expresión C de tipo entero, sujeta a restricciones estrictas. Puede contener .... formateo mucho mejor de lo que puedo lograr aquí rápidamente en el source.