Wofür steht _In_?



  • Hallo,

    was mich schon länger interessiert. Was genau ist _In_ für ein define oder typedef?

    Wie z.B: hier in der Funktion qsort_s aus der stdlib.h

    _CRTIMP void __cdecl qsort_s(_Inout_bytecap_x_(_NumOfElements* _SizeOfElements) void * _Base, 
            _In_ rsize_t _NumOfElements, _In_ rsize_t _SizeOfElements,
            _In_ int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void *_Context);
    


  • _In_ ist kein ANSI C Feature. Vermutlich wird es irgend ein Macro sein. Aber ohne zu wissen, woher du den Code hast, wird dir das niemand genau sagen können (es gibt viele stdlib.h s auf dieser Welt 🙄)



  • ^^ ich nehme an, das ist nur eine #define auf nichts, um den code lesbarer zu gestalten. am 'IN' sieht man, dass der parameter nur gelesen wird. bestimmt gibts auch noch OUT und INOUT (für beides). ach ja, eigentlich ist sowas nur für pointer sinnvoll.
    btw, bei dem code da oben^^ aber egal, diese vielen _ und die formatierung machen sowieso die lesbarkeit zunichte.
    🙂



  • Ist das nicht Microsofts 'SAL'?

    EDIT: Nö, SAL sieht ein wenig anders aus: http://msdn.microsoft.com/en-us/library/ms235402(VS.80).aspx



  • @fricky
    lesbarer? 😃
    da finde ich

    void qsort_s(void *Base, rsize_t NumOfElements, rsize_t SizeOfElements,
                 int (*FuncCompare)(void *, const void *, const void *),
                 void *Context);
    

    oder gar

    typedef int (*func_compare_t)(void *, const void *, const void *);
    void qsort_s(void *Base, rsize_t NumOfElements, rsize_t SizeOfElements,
                 func_compare_t FuncCompare, void *Context);
    

    lesbarer 🙂

    Da es sich um den Teil irgend einer Standardlib handelt, könnte ich mir vorstellen, dass sich hinter _In_ und diesem komischen _Inout_ Macro irgend eine Compilererweiterung steckt bzw. dass dies von irgend einem Dokumentationsgenerator genutzt wird.



  • Aber eigentlich ist FuncCompare ein Zeiger auf eine Funktion.

    typedef int func_compare_t(void *, const void *, const void *);
    void qsort_s(void *Base, rsize_t NumOfElements, rsize_t SizeOfElements,
                 func_compare_t *FuncCompare, void *Context);
    


  • Zur Lesbarkeit: Die Standardlibrary darf keine Bezeichner wie Base verwenden, sondern muss auf reservierte Bezeichner wie _Base ausweichen. Ich nehme an (hoffe), dass die Entwickler der Standardlibrary das in normal lesbarer Schreibweise entwickeln und dann automatisch konvertieren, aber man weiß ja nie ...



  • Bashar schrieb:

    Zur Lesbarkeit: Die Standardlibrary darf keine Bezeichner wie Base verwenden, sondern muss auf reservierte Bezeichner wie _Base ausweichen.

    Warum?



  • #define Base "ich darf das so definieren, wenn es mir Spaß macht"
    /* #define _Base "oops, reservierter Bezeichner" */
    #include <stdlib.h>
    


  • Bashar schrieb:

    #define Base "ich darf das so definieren, wenn es mir Spaß macht"
    /* #define _Base "oops, reservierter Bezeichner" */
    #include <stdlib.h>
    

    Autsch. Das muß ich gelten lassen.



  • Bashar schrieb:

    Zur Lesbarkeit: Die Standardlibrary darf keine Bezeichner wie Base verwenden, sondern muss auf reservierte Bezeichner wie _Base ausweichen. Ich nehme an (hoffe), dass die Entwickler der Standardlibrary das in normal lesbarer Schreibweise entwickeln und dann automatisch konvertieren, aber man weiß ja nie ...

    Ja, das stimmt schon.

    typedef int func_compare_t(void *, const void *, const void *);
    void qsort_s(void *_Base, rsize_t _NumOfElements, rsize_t _SizeOfElements,
                 func_compare_t *_FuncCompare, void *_Context);
    

    Ok, das _CRTIMP und _cdecl hat sicher auch einen Sinn (hätte man aber trotzdem besser benennen können :))



  • rüdiger schrieb:

    Ok, das _CRTIMP und _cdecl hat sicher auch einen Sinn (hätte man aber trotzdem besser benennen können :))

    __cdecl ist eine Aufrufkonvention. Wie willst du die denn anders bennen oder was meinst du?

    @all
    Sry, dass ist aus dem VC 9.0 Include-Verzeichnis. Wahrscheinlich ist es in der Tat ein define auf nichts, dass nur angibt, was mit dem Parameter passiert.



  • FrEEzE2046 schrieb:

    @all
    Sry, dass ist aus dem VC 9.0 Include-Verzeichnis. Wahrscheinlich ist es in der Tat ein define auf nichts, dass nur angibt, was mit dem Parameter passiert.

    Du findest die Definition in sal.h, und sie sieht so aus:

    #define _In_                           _Pre1_impl_(_$notnull) _Deref_pre2_impl_(_$valid, _$readaccess)
    

    Jetzt alles klar? 😉



  • _matze schrieb:

    #define _In_                           _Pre1_impl_(_$notnull) _Deref_pre2_impl_(_$valid, _$readaccess)
    

    Jetzt alles klar? 😉

    Ja, dass habe ich auch schon gefunden. Hat mir natürlich die absolute Erleuchtung gebracht 😉



  • Da _Pre1_impl_ und _Deref_pre2_impl_ auf nix definiert sind, sollte es dich auch halbwegs erleuchten. 😉


Anmelden zum Antworten