Protéger le .h

clampinclampin Membre
09:29 modifié dans API AppKit #1
Salut,

Souvent en C et C++ dans le fichier .h ont doit indiquer

<br />#ifndef IDENTIFICATEUR<br />#define IDENTIFICATEUR<br /><br />/* zone protegee contre les inclusions multiples */<br /><br />#endif /* guard */<br />


Or je vois que lorsqu'on ajoute une classe objective-C on n'a pas le "ifndef...endif"

Est-ce donc inutile en objective-c et pourquoi ?

Merci

Réponses

  • CéroceCéroce Membre, Modérateur
    août 2011 modifié #2
    La directive #import (qui n'existe pas en C) n'inclut le fichier que si ce n'est pas déjà  fait, contrairement à  #include.
    Le problème des inclusions multiples est courant en langage C et on utilise donc la structure que tu cites.
  • AliGatorAliGator Membre, Modérateur
    09:29 modifié #3
    Pour info, certains compilateurs C gèrent la directive de compilateur "#pragma once" qui est également équivalente, et permet d'indiquer au compilateur de n'inclure ce fichier qu'une seule fois, que s'il n'a pas été inclus avant.
    Donc elle a l'effet équivalent au #ifndef/#define/#endif que tu cites. Sauf que c'est une directive #pragma, donc par définition les #pragma sont propres au compilateur (chaque compilateur autorise des #pragma qui lui sont propre et pas forcément d'autres #pragma... et doit ignorer les #pragma qu'il ne connait pas. Du coup d'un compilateur à  l'autre un #pragma comme "#pragma once" n'aura pas forcément d'effet.

    Donc même si dans certains codes C qui ciblent une plateforme et un compilateur spécifique tu pourras trouver des "#pragma once", au final #ifndef/#define/#endif est plus courant car portable et fonctionnant avec tous les compilateurs C.

    Par contre, en Objective-C, comme l'a décrit Céroce, la directive #import fait partie du langage Objective-C, et donc est supportée par tous les compilateurs sachant compiler de l'Objective-C (comme gcc, llvm, ...). C'est d'ailleurs pour cela qu'elle est utilisée partout, à  la place de #include.
Connectez-vous ou Inscrivez-vous pour répondre.