2009-10-23 5 views
0

Je cours Xcode dans OS X 10.6 sur un Core 2 Duo. Voici un programme court:inutile (?) Xcode d'avertissement

#include <stdio.h> 

int main() { 
    long a = 8589934592L; 
    printf("a = %li\n", a); 
    return 0; 
} 

Quand je compile ce à partir de la ligne de commande (gcc -pedantic) Je reçois aucune erreur ou avertissement. Quand je compile ceci dans Xcode dans la configuration de débogage, je n'obtiens aucune erreur ou avertissement. Quand je compile ceci dans Xcode dans la configuration de version, j'obtiens un avertissement: "Dépassement dans la conversion constante implicite".

Les temps longs doivent être de 64 bits. Et le programme fonctionne bien. Alors qu'est-ce qui se passe, et comment puis-je me débarrasser de cet avertissement?

Répondre

2

Vérifiez sizeof(long) et sizeof(long long) pour voir si votre hypothèse sur long étant un type 64 bits est correcte.

J'ai simplement essayé votre programme avec Xcode 3.2.1 sous Mac OS X 10.6.1 et je n'ai pas reçu cet avertissement. J'ai réussi à obtenir l'avertissement en définissant la configuration cible sur "Universal 32 bits" au lieu de "Universal 32/64 bits universal". Assurez-vous que vous construisez pour le bon type de machine!

+0

Désolé, aurait dû expliquer: OS X utilise le modèle de données LP64 (voir http://developer.apple.com/macosx/64bit.html), dans lequel les longs sont 64 bits. – Everett

+0

Je suppose qu'il existe un paramètre de projet Xcode qui indique que vous créez un code de sécurité 32 bits. –

+0

Merci Carl --- oui, c'était le problème. Je suis nouveau à Xcode, et je ne pouvais pas trouver ce paramètre avant d'avoir obtenu des indices ici. – Everett

0

Le problème ici est que les longs sont 32 bits, pas 64. long long est 64 bits.

Sur un Mac Pro en cours d'exécution 10.6

#include <stdio.h> 
int main() { 
    printf("%d.\n", sizeof(long)); 
    printf("%d.\n", sizeof(long long)); 

} 

sorties

4. 
8. 
+0

Comme Rüdiger le souligne, cela dépend des paramètres de construction. Si vous sélectionnez le projet et Obtenir des infos, vous pouvez définir l'architecture sur Universal 32 bits, Intel 64 bits ou Universal 32 bits par défaut. Selon votre choix, le programme que vous incluez ci-dessus donnera différentes sorties ... – Everett

2

Dans les paramètres de construction, cochez la case "Architectures". Si c'est "Standard (32/64 bits universel)", alors des binaires universels avec des versions 32 bits et 64 bits seront construits. L'avertissement concerne la version 32 bits. La différence que vous voyez provient de "Build Active Architecture Only" en cours de vérification dans la configuration du débogage, mais pas dans la configuration de la version. Donc, la version 32 bits n'est pas compilée lorsque vous compilez pour Debug sur 64 bits, et donc il n'y a pas d'avertissement.

+0

Ah! Je vous remercie! C'est exactement le problème. – Everett

Questions connexes