Où mettre une fonction C pour qu'elle soit accessible à  toutes les classes ?

Tout est dans le titre.



Où mettre ce genre de fonction:





[color=#703daa]CGFloat[/color] DegreesToRadians([color=#703daa]CGFloat[/color] degrees) { [color=#bb2ca2]return[/color] degrees * [color=#78492a]M_PI[/color] / [color=#272ad8]180[/color]; }




de manière à  ce qu'elle soit disponible pour plusieurs classes ?



Dans quel type de fichiers ?

Réponses

  • CéroceCéroce Membre, Modérateur
    Dans un .h, mets le proto.

    Dans le .c, l'implémentation, comme en ObjC.



    Dans cet exemple, tu pourrais aussi préférer une macro:
    <br />
    #define RADIANS_FROM_DEGREES(degrees) ((degrees/180.0)*M_PI)<br />
    


    Ainsi, pas besoin de .c, et la conversion est faite à  la compilation.
  • muqaddarmuqaddar Administrateur
    1) C'est vrai que pour mon exemple, la macro est pratique.



    2) J'ai essayé un .c au début, ça n'a pas marché ? (J'avais importé Foundation)



    3) J'avais aussi essayé un .h, qu'appelles-tu le proto dans ce cas ?
  • Tu peux mettre des fonctions C:

    - dans un fichier .c (sans appel Objective-C)

    - dans un fichier .m (avec appel Objecive-C)



    le .h sert généralement à  mettre les protos qui sont en fait les signatures des fonctions (le nom sans l'implémentation)
  • muqaddarmuqaddar Administrateur
    'Lexxis' a écrit:


    Tu peux mettre des fonctions C:

    - dans un fichier .c (sans appel Objective-C)

    - dans un fichier .m (avec appel Objecive-C)



    le .h sert généralement à  mettre les protos qui sont en fait les signatures des fonctions (le nom sans l'implémentation)




    Ah ok, j'ai compris ce qu'il s'est passé.



    1) Dans le .c, j'ai appelé de l'Objective-C, je pensais bêtement qu'en important <Foundation> avant ça pourrait marcher.

    2) J'ai essayé le .m en premier mais ça n'avait pas marché non plus, peut-être parce que je n'avais pas de .h (je ne me souviens plus de l'erreur de compil)
  • Cas typique pour une fonction static inline !



    Tu la déclares dans un fichier .h et c'est tout:



    static inline CGFloat DegreesToRadians(CGFloat degrees) { return degrees * M_PI / 180; }



    [font=arial,helvetica,sans-serif]Après si tu fais une recherche Google, tu verras des gens qui disent qu'il ne faut pas mettre les static inline dans un hearder et d'autres qui disent le contraire ![/font]



    http://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function





    Perso, j'ai une paire de fonctions static inline dans un .h dont je me sers pour toutes les applications et je n'ai jamais eu de problème que ce soit en ObjC ou en C++.
  • muqaddarmuqaddar Administrateur
    Merci mpergand !
  • FKDEVFKDEV Membre
    décembre 2012 modifié #8
    Voici un exemple concret avec .h et .m et Foundation.

    Il n'y a pas vraiment d'intérêt à  faire du .c pur.

    Normalement en C, c'est un peu plus compliqué à  cause du #include qui est moins intelligent que le #import.





    global_util.h
    <br />
    [color=#CF231D][font=Menlo][size=2][color=#77482B]#import [/color]&lt;CoreFoundation/CoreFoundation.h&gt;[/size][/font][/color]<br />
    [font=Menlo][size=2][color=#B80FA2]BOOL[/color] isOSVersionGreaterThan([color=#6F32A9]NSString[/color]* reqSysVer);[/size][/font]<br />
    






    global_util.m


    <br />
    [color=#CF231D][font=Menlo][size=2]<br />
    [color=#77482b]#import [/color]&quot;global_utils.h&quot;[/size][/font][/color]<br />
    <br />
    [font=Menlo][size=2][color=#b80fa2]BOOL[/color] isOSVersionGreaterThan([color=#6f32a9]NSString[/color]* reqSysVer)[/size][/font]<br />
    [font=Menlo][size=2]{[/size][/font]<br />
    [font=Menlo][size=2]	[color=#6f32a9]NSString[/color] *currSysVer = [[[color=#6f32a9]UIDevice[/color] [color=#3c0f81]currentDevice[/color]] [color=#3c0f81]systemVersion[/color]];[/size][/font]<br />
    [color=#3C0F81][font=Menlo][size=2][color=#000000]	[/color][color=#b80fa2]if[/color][color=#000000] ([currSysVer [/color]compare[color=#000000]:reqSysVer [/color]options[color=#000000]:[/color]NSNumericSearch[color=#000000]] &#33;= [/color]NSOrderedAscending[color=#000000])[/color][/size][/font][/color]<br />
    [font=Menlo][size=2]		[color=#b80fa2]return[/color] [color=#b80fa2]TRUE[/color];[/size][/font]<br />
    [color=#B80FA2][font=Menlo][size=2][color=#000000]	[/color]return[color=#000000] [/color]FALSE[color=#000000];[/color][/size][/font][/color]<br />
    [font=Menlo][size=2]}[/size][/font]<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.